SQL优化的目的:
定位到项目中执行慢且频率高的SQL让其执行的速度更快。
优化的思路:
1、 统计当前项目中SQL的执行频率;
2、 统计当前项目中SQL的执行时间;
3、 分析执行慢的原因;
4、 解决问题。
现状调查:
1、 定位那些语句执行慢(查看执行频率):
1)show status like 'com_'; 显示当前所有统计参数的值;
2)show processlist; 查看MySql的执行情况;
2、 统计SQL的执行时间步骤:
1)set profiling=1; 开启profiling开关
2) 执行语句:
show databases;
use db_01;
show tables;
select * from tb_item where id < 5;
select count(*) from tb_item;
3、 show profiles; 查看SQL语句执行的耗时情况
4、 show profile for query query_id; 查看该SQL执行过程中每个线程状态和消耗时间
原因分析:
explain 关键字 分析执行计划 示例:
查看SQL语句的执行:
explain select * from tb_item where id = 1;
.........
.........
将需要分析的SQL前加上关键字 explain(显示的状态图)
图片:![type状态图:](https://img-blog.csdnimg.cn/2019120422584717.PNG)
type字段:
表示连接类型,性能由好到差的连接类型常见为:range 一般,ref 好 all 待改进。
要因确认
1、如果MySQL评估使用索引比全表更慢,则不使用索引;
2、以%开头的模糊查询,索引失效;
3、尽量使用覆盖索引,避免select *;
4、不要在索引上进行运算操作,否则索引失效;
5、尽量使用复合索引,减少使用单列索引;
6、认真分析含有 is NULL, is NOT NULL, IN, NOT IN 的语句。
问题解决
举例:
1 优化 order by 语句:
优化前: explain select * from emp order by age desc;
优化后: explain select id from emp order by age desc;
2 优化 group by 语句:
优化前:explain select age,count(*) from emp group by age;
优化后:explain select age,count(*) from emp group by age order by null;
3 优化嵌套查询:
优化前:explain select * from user where id in (select user_id from user_role);
优化后:explain select * from user u, user_role ul where u.id=ul.id;
4 使用索引 USE INDEX:
优化前: explain select * from age where id = 8;
优化后:explain select * from age use index(user_name) where id = 8;