为什么说明显示“正在使用索引条件”?

时间:2019-06-11 02:27:38

标签: optimization mariadb

我正在研究在mariadb中使用索引条件

这是用于Centos7并运行Mariadb 10.2

这是我的SQL。

创建索引

create index ixnn_product__updated_at
    on product (updated_at);

解释

explain extended
select * from product
where updated_at BETWEEN '2018-06-10 00:00:00' AND '2019-06-10 23:59:59'

结果

          id: 1
  select_type: SIMPLE
        table: product
         type: range
possible_keys: ixnn_product__updated_at
          key: ixnn_product__updated_at
      key_len: 5
          ref: NULL
         rows: 2431232
     filtered: 100.00
        Extra: Using index condition

我期望额外使用索引,但看到使用索引条件

所以我添加了测试。

解释

explain extended 
select updated_at from product
 where updated_at BETWEEN '2018-06-10 00:00:00' AND '2019-06-10 23:59:59' 

结果

          id: 1
  select_type: SIMPLE
        table: product
         type: range
possible_keys: ixnn_product__updated_at
          key: ixnn_product__updated_at
      key_len: 5
          ref: NULL
         rows: 2431232
     filtered: 100.00
        Extra: Using where; Using index

为什么会这样?

1 个答案:

答案 0 :(得分:1)

Using index conditionUsing index不相关优化。 (不幸的是名字太近了。)

可以通过其他名称来研究

Using index conditionICPIndex Condition Pushdown。这是对引擎(例如,InnoDB)将行传递回“ Handler”的一种加速。借助ICP,引擎可以进行测试(针对您的情况updated_at)。

Using index表示索引正在“覆盖”。这意味着表中需要的 all 列都存在于所使用的索引中。这意味着查询可以完全在索引的BTree中执行,而不必深入到数据的Btree。您的第一个SELECT需要所有列(*);您的秒只需要updated_at,所以它是“覆盖”的。

(ICP已在5.3中添加到MariaDB;在5.6中已添加到Mysql。)