0
点赞
收藏
分享

微信扫一扫

MySQL性能优化之常用SQL语句优化

上一篇 <<<MySQL性能优化之表设计优化
下一篇 >>>MySQL性能优化之索引调优实战


SQL性能优化的目标:至少要达到range级别,要求是ref级别,consts最高。【阿里巴巴JAVA开发手册】

语句优化

1.简单查询语句优化

1.1 select 字段部分

  • a、返回具体的字段以代替*
  • b、count(*)会统计null值的行,count(列名)不会统计null值的行
select count(user_id) from dw_user where `order` is null limit 10; 结果:5875
select count(0) from dw_user where `order` is null limit 10; 结果:5875
select count(`order`) from dw_user where `order` is null limit 10;  结果:0
  • c、函数统计,尽量放到内存中执行
select sum(a)+sum(b) as c
  • d、tinyint在使用时容易变为布尔型,代码中记得转换,用case时等于更优
case status when 0 then do1 when 1 do2 end
===》
case when status=0 then do1 when status=1 then do2 end

1.2 条件部分

  • a、数据类型必须一致,否则索引失效,还会增加转换的开销
SELECT * FROM t WHERE id = '19';
----->
SELECT * FROM t WHERE id = 19;
  • b、少用≥,直接使用>,可提升查询效率
select * from dw_user where user_id>=101; ----—多一次等于的判断 
select * from dw_user where user_id>100;

1.3 分组和排序

SELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;
---->
SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4; 
在group by 后面增加 order by null 就可以防止排序. 
explain select * from emp  group by deptno order by null; 

排序细节可参考order by中的单路和双路排序算法原理

1.4 索引不起效果的写法

  • a、使用group by、not in、not like不使用索引

2.查询语句-临时表场景

2.1 必须创建临时表的情况

2.2 临时表的显示删除

3.插入语句

//批量插入使用/*+append*/ 
insert into p_nbsc_ho1 select * from p_nbsc_ho (消耗时间73分钟)
insert /*+append*/ into p_nbsc_ho2 select * from p_nbsc_ho (消耗时间7分钟) 

4.更新语句

5.开发代码中少用truncate table


推荐阅读:
<<<MySQL执行计划示例解读
<<<MySQL性能优化之慢查询定位
<<<MySQL性能优化之表设计优化
<<<MySQL性能优化之索引调优实战
<<<MySQL性能优化之分页查询优化
<<<MySQL性能优化之关联查询优化
<<<MySQL性能优化之in、exists优化
<<<order by中的单路和双路排序算法原理
<<<MySQL如何性能优化面试题完美解答

举报

相关推荐

0 条评论