一般怎么分析一个sql
explain语句进行分析。还需要进一步分析的话可以进行optimizer_trace,一共prepare、optimizer、execute阶段,主要关注optimizer阶段。
type
详见索引的访问类型。
key
实际使用的索引。
key_len
使用的索引的长度。可以分析联合索引用上了几个字段。如果命中的索引字段默认空值,会增加1字节。
rows
MYSQL认为必须检查的用来返回请求数据的行数。
extra
using index 索引覆盖,减少回表。
using index condition:叫作
Index Condition Pushdown Optimization (索引下推优化)。
mysql5.6版本后推出 索引下推,server层过滤下推到存储引擎层,减少回表。
//t4表存在content1的普通索引
EXPLAIN SELECT * FROM t4 WHERE content1 > 'z' AND content1 LIKE '%a';
- 如果没有索引下推(ICP),那么MySQL在存储引擎层找到满足content1 > 'z'条件的第一条二级索引记录。主键值进行回表,返回完整的记录给server层,server层再判断其他的搜索条件是否成立。如果成立则保留该记录,否则跳过该记录,然后向存储引擎层要下一条记录。
- 如果使用了索引下推(ICP),那么MySQL在存储引擎层找到满足content1 > 'z'条件的第一条二级索引记录。不着急执行回表,而是在这条记录上先判断一下所有关于idx_content1索引中包含的条件是否成立,也就是content1 > 'z' AND content1 LIKE '%a'是否成立。如果这些条件不成立,则直接跳过该二级索引记录,去找下一条二级索引记录;如果这些条件成立,则执行回表操作,返回完整的记录给server层。
关闭索引下推
set optimizer_switch='index_condition_pushdown=off';
using filesort 需要关注,参考排序原理。
Using join buffer (Block Nested Loop) 需要关注,需要进行嵌套循环计算,关联字段增加索引。