前面讲了如何设计数据库表结构、存储引擎、索引优化等内存,这篇文章会讲述如何进行SQL优化,也是面试中关于数据库肯定会被问到的,
这些内容不仅仅是为了面试,更重要的是付诸实践,最终用到工作当中
之前的MySQL内存地址:MySQL系列内容
如何获取存在性能的SQL:
1、通过生产环境用户、测试人员反馈的应用响应速度较慢,可能就是SQL性能较差导致的
2、通过慢查询日志获取
3、实时获取存在性能问题的SQL
MySQL慢查日志:
参数:
1、slow_query_log 是否启动慢查询日志,默认不开启,on/off,动态参数,运行时通过set global slow_query_log=on设置,也可以
通过脚本定时开关
2、slow_query_log_file 日志存储和数据存储的文件名和路径,最好是自己设置,而不是默认,日志和数据文件要区分开
3、long_query_time 慢查询日志SQL执行时间的阀值 单位s,默认10s,超过这个执行时间的SQL都会被记录下来,无论是查询还是修改,
还是记录已经回滚的SQL,最大精确到微妙ms,可以设置为1ms比较合适
4、log_queries_not_using_indexes 是否记录未使用索引的SQL
慢查询日志常用分析工具:
1、MySQLdumpslow 官方推荐
汇总除查询条件外其他完全相同的SQL,并将分析结果按照参数中所指定的顺序输出
mysqldumpslow -s r -t 10 mysql-slow.log; -s order(c,t,l,r,at,al,ar) 输出结果排序方式: c count查询总次数 t time总时间 l lock查询锁的时间 r row总数据行 加上a,就是取平均数 -t top指定取前几条作为结果输出
2、pt-query-digest 功能更强大一些
实时获取慢查询SQL:
SELECT ID,`user`,`HOST`,DB,COMMAND,TIME,STATE,INFO FROM information_schema.`PROCESSLIST` WHERE TIME >=60;
SQL处理查询请求的过程:
1、客户端发送SQL给服务器
2、服务器检查是否在查询缓存中命中该SQL
可以设置是否使用查询缓存,内存大小等
查询缓存对SQL查询的影响
3、服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划
4、然后存储引擎根据查询计划来查询数据