SQL调优之Explain关键字详解( 三 )


Using where查询的列未被索引覆盖 , where筛选条件非索引的前导列,Extra 中为 Using where 。

SQL调优之Explain关键字详解

文章插图
 
所谓前导列,就是在创建复合索引语句的第一列或者连续的多列 。比如通过:CREATE INDEX comp_ind ON table1(x, y, z)创建索引,那么x,xy,xyz都是前导列 , 而yz,y,z这样的就不是 。
using where,using index查询的列被索引覆盖,并且 where筛选条件是索引列之一但是不是索引的前导列,Extra中为Using where; Using index,意味着无法直接通过索引查找来查询到符合条件的数据;
SQL调优之Explain关键字详解

文章插图
查询的列被索引覆盖,并且where筛选条件是索引列前导列的一个范围 , 同样意味着无法直接通过索引查询到符合条件的数据
SQL调优之Explain关键字详解

文章插图
Using index condition查询的列不全在索引中,where条件中是一个前导列的范围
SQL调优之Explain关键字详解

文章插图
查询列不完全被索引覆盖,查询条件完全可以使用到索引(进行索引查找)
SQL调优之Explain关键字详解

文章插图
NULL(既没有Using index , 也没有Using where Using index,也没有using where) 。
查询的列未被索引覆盖 , 并且where筛选条件是索引的前导列,意味着用到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地用到了索引 , 也不是完全没用到索引,Extra中为NULL(没有信息) 。
SQL调优之Explain关键字详解

文章插图
Using join buffer使用了连接缓存 。
小表驱动大表
在表连接过程中 。一般选择小表作为驱动表,大表作为被驱动表 。
驱动表(小表)的连接字段无论建立没建立索引都需要全表扫描的 。被驱动表(大表)如果在连接字段建立了索引,则可以走索引 。如果没有建立索引则也需要全表扫描 。
 
两张表连接的情况
被驱动表的连接字段有索引:主键索引
对于驱动表中的每一条数据,到被驱动表的聚簇索引上寻找其对应的数据 。
被驱动表的连接字段有索引:二级索引
对于驱动表上的每一条数据,到被驱动表的二次索引上寻找其对应的数据id,然后再根据数据id到聚簇索引上寻找对应的数据 。
被驱动表的连接字段没有索引
对于驱动表上的每一条数据,都要到被驱动表上进行一次全表遍历 , 找到对应的数据 。
join buffer的作用
就是针对被驱动表的连接字段没有索引的情况下需要进行全表扫描,所以引入了join buffer内存缓冲区来对这个全表扫描过程进行优化 。
impossible wherewhere子句总是false,不能用来获取任何元素 。即筛选条件没能筛选出任何数据 。
select tables optimized away在没有 GROUPBY 子句的情况下,基于索引优化 MIN/MAX操作 。
distinct优化 distinct操作 。在找到第一匹配的时候就停止找同样的动作 。




推荐阅读