定位并优化慢查询sql

it2025-05-14  16

1.根据慢日志定位查询

1.show VARIABLES like '%QUERY%';

查看系统慢日志等其他系统功能信息

参数解析 long_query_time:超时记录时间

slow_query_log_file:慢日志位置

2.show status like '%slow_queries%';

查看慢日志中包含的慢查询sql语句条数

3.set global slow_query_log = on;

将状态设置为 on

4.set GLOBAL long_query_time=1;

修改超时记录时间为1s

5.测试

执行:SELECT SLEEP(10);

执行:show status like '%slow_queries%';

之后可以到对应文件查看详细的语句的执行信息

6.查看详细信息

Query_time: 10.002167 //具体的执行时间

2.使用explain等工具分析sql

type代表的是对表的扫描方式,id的大小代表执行的顺序,key代表使用的键,extra代表其他额外信息。

着重关注点:

type:ALL:全表扫描,当出现ALL时需要关注。INDEX:使用索引。

性能排序:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

extra如果出现以下两情况,可能需要调优

Using filesort (文件排序):如果一个排序操作不能通过索引来完成,那这次排序操作就叫做filesort,这跟file没有任何关系。filesort应该叫做sort,而它的实现,就是大家熟悉的快排。

Using temporary(临时表):

3.修改sql或者尽量让sql走索引

4.最左匹配原则

 

1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直至遇到范围查询(> < between like)就停止匹配,比如 a=3 abd b=4 and c>5 and d=6 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则可以用到,a,b,d的顺序可以任意调整

2.=和in可以乱序,比如a=1  and  b=2  and  c=3  建立(a,b,c)索引可以任意顺序,mysqk的查询优化器会自动优化成索引可以识别的形式。

5.创建、删除索引

alter table table_test add index index_test1(name) ;

alter table table_name drop index index_name ;

最新回复(0)