我正在研究在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
为什么会这样?
答案 0 :(得分:1)
Using index condition
和Using index
是不相关优化。 (不幸的是名字太近了。)
Using index condition
:ICP
或Index Condition Pushdown
。这是对引擎(例如,InnoDB)将行传递回“ Handler”的一种加速。借助ICP,引擎可以进行测试(针对您的情况updated_at
)。
Using index
表示索引正在“覆盖”。这意味着表中需要的 all 列都存在于所使用的索引中。这意味着查询可以完全在索引的BTree中执行,而不必深入到数据的Btree。您的第一个SELECT
需要所有列(*
);您的秒只需要updated_at
,所以它是“覆盖”的。
(ICP已在5.3中添加到MariaDB;在5.6中已添加到Mysql。)