一.查询优化
1.永远小表驱动大表,类似嵌套循环Nested Loop
image.png
2.order by关键字优化
1)ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序
MySQL支持二种方式的排序,FileSort和Index,Index效率高。它指MySQL扫描索引本身完成排序。FileSort方式效率较低。
ORDER BY满足两情况,会使用Index方式排序:ORDER BY语句使用索引最左前列;使用where子句与OrderBy子句条件列组合满足索引最左前列
2)尽可能在索引列上完成排序操作,遵照索引建的最佳左前缀
3)如果不在索引列上,filesort有两种算法:mysql就要启动双路排序和单路排序
双路排序:
1.MySQL4.1之前是使用双路排序,字面意思是两次扫描磁盘,最终得到数据。
读取行指针和orderby列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据传输
2.从磁盘取排序字段,在buffer进行排序,再从磁盘取其他字段。
单路排序:
1.取一批数据,要对磁盘进行两次扫描,众所周知,I\O是很耗时的,所以在mysql4.1之后,出现了第二张改进的算法,就是单路排序。
2.从磁盘读取查询需要的所有列,按照orderby列在buffer对它们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据,并且把随机IO变成顺序IO,但是它会使用更多的空间,因为它把每一行都保存在内存中了。
4)结论及引申出的问题?
1.由于单路是后出来的,总体而言好过双路
image.png
2.优化策略
增大sort_buffer_size参数的设置
增大max_length_for_sort_data参数的设置
image.png
5)小总结
image.png
3.GROUP BY关键字优化(和order by 雷同)
1)groupby实质是先排序后进行分组,遵照索引建的最佳左前缀
2)当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置
3)where高于having,能写在where限定的条件就不要去having限定了。
二. 慢查询日志
1.查看是否开启及如何开启
image.png
image.png
image.png
2.查看当前多少秒算慢
SHOW VARIABLES LIKE 'long_query_time%';
3.设置慢的阙值时间
image.png
4.查询当前系统中有多少条慢查询记录
image.png
5.配置版
image.png
6.日志分析工具mysqldumpshow
image.png
·
三.Show profiles
mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优测量;默认情况下,参数处于关闭状态,并保存最近15次的运行结果
分析步骤:
1.是否支持,看看当前的SQL版本是否支持
image.png
2.开启功能,默认是关闭,使用前需要开启
image.png
3.运行SQL
4.查看结果,show profiles;
5.诊断SQL,show profile cpu,block io for query 上一步前面的问题SQL 数字号码;
image.png
参数备注
image.png
6.日常开发需要注意的结论
1)converting HEAP to MyISAM 查询结果太大,内存都不够用了往磁盘上搬了。
2)Creating tmp table 创建临时表
3)Copying to tmp table on disk 把内存中临时表复制到磁盘,危险!!!
4)locked
四.全局查询日志
1.配置启用
image.png
2.编码启用
image.png

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
·
image.png
image.png
image.png
image.png
image.png











网友评论