mysql优化层级
第一优先级:sql及索引
第二优先级:数据表结构
第三优先级:系统配置
第四优先级:硬件
第一步:
确定慢查询语句
开启慢查询日志
1 show VARIABLES like 'slow_query_log'; 2 3 show VARIABLES like '%log%'; 4 5 set global log_queries_not_using_indexes=on; 6 7 show VARIABLES like 'long_query_time'; #慢查询时间分界线 8 9 show VARIABLES like 'slow_query_%' 10 11 set global slow_query_log=on;
日志查看工具:pt-query-digest
第二步:
如何分析sql查询
explain返回各列的含义
table:显示这一行的数据是关于哪张表的
type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL
possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。
key:实际使用的索引。如果为null,则没有使用索引。
key_len:使用的索引长度 在不损失精确性的情况下,长度越短越好
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows:msyql 认为必须检查的用来返回请求数据的行数
using filesort: 看到这个得时候,查询就需要优化了。mysql需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行指针来排序全部行
using temporary 看到这个得时候,查询需要优化了。这里mysql需要创建一个临时表来存储结果,这通常发生在对不通的列集进行order by上,而不是Group by上
优化语句
count 不统计null值
SELECT COUNT(release_year='2006' OR NULL) as '2006电影',COUNT(release_year='2007' OR NULL) as '2007电影' from film