-
分析步骤
-
观察,至少跑一天,看看生产的慢sql情况
-
开启慢查询日志,设置阈值,比如超过5秒钟的就是慢sql,并将它抓取出来
-
explain + 慢sql分析
-
show profile
-
以上4步完还不行,就需要运维经理或者DBA进行参数调优
-
-
总结
-
慢查询的开启并捕获
-
explain + 慢sql分析
-
show profile查询SQL在Mysql服务器里面执行细节和生命周期情况
-
SQl数据库服务的参数调优
-
-
查询优化
-
永远小表驱动大表类似嵌套循环Nested Loop,即小的数据集驱动大的数据集
-
order by 优化
-
order by子句,尽量使用index方式排序,避免使用FileSort方式排序,尽可能在索引列上完成排序操作,遵循索引建立的最佳左前缀
-
Mysql支持两种方式的排序,filesort和index,Index效率高,它指Mysql扫描所以本身完成排除。Filesort效率较低
-
order by 满足两种情况会使用Index方式排序
-
order by语句使用索引最左前列
-
使用where子句与order by子句条件列组合满足索引最左前列
-
-
-
如果不在索引列上,filesort有以下两种算法
-
双路排序:Mysql4.1之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据,读取行指针和order by 列,对他们进行排序,然后扫描已经排好序的列表,按照列表中的值重新从列表中读取对应的数据输出
-
单路排序:从磁盘读取查询需要的所有列,按照order by列在buffer对他们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免第二次读取数据。并且把随机IO变成了顺序IO,但是他会使用更多的空间,因为它的每一行都保存在内存中了
-
单路排序可能会出现的问题:在sort_buffer中,方法B比方法A要多占用很多空间,因为方法B是把所有字段都取出,所以有可能取出的数据的总大小超出了sort_buffer的容量,导致每次只能读取sort_buffer容量大小的数据,进行排序(创建tmp文件,进行多路合并),排完再取sort_buffer容量大小,再排....从而多次IO.本想一次IO结果造成多次IO
-
-
优化策略
-
增加sort_buffer_size的参数设置
-
-
-
总结
-
-
group by优化
-