SQL语句优化
【数据库优化的目的】
1.避免出现页面访问错误
由于数据库连接timeout产生页面5XX错误。
由于慢查询造成页面无法加载。
由于阻塞造成数据无法提交。
2.增加数据库的稳定性
很多数据库问题都是由于低效的查询引起的。
3.优化用户体验
流畅的访问速度。
良好的网站功能体验。
【从哪些方面进行数据库优化】
【SQL及索引优化】
【如何发现有问题的SQL】
使用MySql慢查询对有效率问题的SQL进行监控
#是否开启了慢查询日志 show VARIABLES like 'slow_query_log'; #查看超过多少秒的查询会被记录到慢查询日志中 show VARIABLES like 'long_query_time' ; #指定慢查询日志所存储的位置 set GLOBAL slow_query_log_file = 'D:\mysql_log\mysql-slow.log' #把没有使用索引的SQL语句记录到慢查询日志中 set GLOBAL log_queries_not_using_indexes = ON ; #打开慢查询日志 set GLOBAL slow_query_log = ON; #超过1秒的慢查询记录到日志中 set GLOBAL long_query_time = 1 ;
【慢查询日志的存储格式】
【这里有待补充....】
【如何通过慢查询日志发现有问题的SQL】
1.查询日数多且每次查询占用时间长的SQL
通常为pt-query-digest分析的前几个查询。
2.IO大的SQL
注意pt-query-digest分析中的Rows examine项。
3.未命中索引的SQL
注意pt-query-digest分析中的Rows examine 和 Rows Send 的对比。
【如何分析SQL查询】
使用explain查询SQL的执行计划
[ 字段解释 ]
table:显示这一行的数据是关于哪张表的
type:这是重要的列,显示连接使用了何种类型。最好到最差的连接类型为const、eq_reg、ref、range、index、ALL
possible_key:显示可能应用在这张表的索引,如果为空,没有可能的索引。
key:实际使用的索引。如果为NULL,则没有使用索引。
key_len:使用索引的长度。在不损失精确性的情况下,长度越短的越好。
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。
rows:MySQL认为必须检查的用来返回请求的行数。
Extra:该列需要注意的返回值:
Using filesort:看到这个的时候,查询就需要优化了。MySQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部的行指针来排序全部行。
Using temporary:看到这个的时候,查询就需要优化了。这里MySQL需要创建一个临时的表来存储结果,这通常发生在对不同的列集进行order by上,而不是group by上。