explain
explain+sql语句
● id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
● select_type: SELECT 查询的类型.
● table: 查询的是哪个表
● partitions: 匹配的分区
● type: join 类型
● possible_keys: 此次查询中可能选用的索引
● key: 此次查询中确切使用到的索引.
● ref: 哪个字段或常数与 key 一起被使用
● rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
● filtered: 表示此查询条件所过滤的数据的百分比
● extra: 额外的信息
1.type 类型的性能比较
通常来说, 不同的 type 类型的性能关系如下:
ALL < index < range ~ index_merge < ref < eq_ref < const < system
ALL 类型因为是全表扫描, 因此在相同的查询条件下, 它是速度最慢的.
而 index 类型的查询虽然不是全表扫描, 但是它扫描了所有的索引, 因此比 ALL 类型的稍快.
后面的几种类型都是利用了索引来查询数据, 因此可以过滤部分或大部分数据, 因此查询效率就比较高了.
2.rows
rows 也是一个重要的字段. MySQL 查询优化器根据统计信息, 估算 SQL 要查找到结果集需要扫描读取的数据行数.
这个值非常直观显示 SQL 的效率好坏, 原则上
rows 越少越好.
3.Extra
EXplain 中的很多额外的信息会在 Extra 字段显示, 常见的有以下几种内容:
● Using filesort
当 Extra 中有 Using filesort 时, 表示 MySQL 需额外的排序操作, 不能通过索引顺序达到排序效果. 一般有 Using filesort, 都建议优化去掉, 因为这样的查询 CPU 资源消耗大.
● Using index
"覆盖索引扫描", 表示查询在索引树中就可查找所需数据, 不用扫描表数据文件, 往往说明性能不错
● Using temporary
查询有使用临时表, 一般出现于排序, 分组和多表 join 的情况, 查询效率不高, 建议优化.
优化总结口诀
全值匹配我最爱,最左前缀要遵守。
带头大哥不能死,中间兄弟不能断。
索引列上少计算,范围之后全失效。
LIKE百分写最右,覆盖索引不写星。
不等空值还有or,索引失效要少用。
VAR引号不可丢,SQL高级也不难。