1.定位到执行慢的sql语句
执行show VARIABLES LIKE '%quer%'
第一个表示慢日志是否开启,默认关闭,第二表示慢日志的文件的位置。<br>一般执行时间超过10秒的sql语句就会被放进这个文件里面(10秒是默认值,可以修改),这样就可以定位到执行慢的sql语句。
2.用explain分析执行慢的语句
ID:表示查询中执行select子句或操作表的顺序,当id相同时,按从上到下的顺序执行,id不同时,id数值大的先执行。
select_type:select_type代表的是查询的类型,主要是用于区别普通查询,联合查询,子查询。<br> SIMPLE :简单的select查询,查询中不包含子查询或者UNION。<br> primary:查询中若包含任何的子查询,最外层查询则被标记为primary。<br> subquery:表示子查询。<br> dervied:zai from列表中包含的子查询标记为derived(衍生) mysql会递归执行浙西子查询,把结果放在临时表里。<br> UNION 若第二个SELECT出现在UNION之后,则被标记为UNION:若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVE<br> union result :从union表获取结果的select。<br><br>
table:表示执行的表
type:type所显示的是查询使用了哪种类型…<br>这个字段很重要,从好到坏的顺序是:system > const > eq_ref > ref > range > index > all<br>一般来说,至少要保证能达到range级别。<br> system:该类型表示表中只有一行记录<br> const:常量匹配,表示通过索引一次就可以找到数据<br> eq_ref:唯一性索引扫描,对于每个索引建,表中只有一条记录和它匹配<br> ref 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体<br> range:只查找范围内的数据,使用索引来匹配行,查询的范围缩小了,自己比前面的类型性能更好<br> index:(full index scan)全索引文件扫描比all要好不少,将直接从索引数据结构中找寻数据,比全表扫描理论上快不少<br> all: Full Table Scan 将遍历全表以找到匹配的行<br><br>
possible_keys: 显示可能应用在这张表中的索引,一个或多个,但不一定会使用到
keys:显示查询语句中实际使用的索引,如果没有使用则为null
key_len: 显示索引中使用的字节数,通过key_len计算查询中使用的索引长度,在不损失精确性的情况下索引长度越短越好,key_len显示的值为索引字段最可能的长度,并非是实际使用长度
ref:显示索引的那一列被使用了,如果可能的话,最好是一个常数。
rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,越少越好
extra:包含十分重要的额外信息<br>Usiing filesort:说明mysql读数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,mysql无法利用索引完成的排序称为"文件排序".<br> Using temporary:使用了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。<br> Using index:表示相应的select操作中使用了覆盖索引,.<br> Using where : 表明使用了where过滤<br> Using join buffer:表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些<br> impossible where:where子句的值总是false,不能用来获取任何元组<br><br>
3.对对应的sql语句进行优化
通过一些提高性能的经验来修改sql语句,或者让sql走索引。