mysql执行计划说明

时间:2015-05-29 17:41:18

标签: mysql sql sql-execution-plan mysql-5.5

有以下查询

select count(*)
from my_table my_t
where my_t.c1 = '3' and my_t.c2 = '123'

此表在(c1,c2)上有索引,这两列都有not null约束。

其执行计划:

# id, select_type, table, type, possible_keys,    key, key_len,         ref, rows, Extra
   1,      SIMPLE,  my_t,  ref,        my_idx, my_idx,     157, const,const,    1, Using where; Using index

它用于何处,但出于何种目的?由于两列都不为null,因此index肯定会包含所有记录,只需要对它们进行计数。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

documentation说:

  

使用索引

     

仅使用索引树中的信息从表中检索列信息,而无需执行额外的搜索来读取实际行。当查询仅使用属于单个索引的列时,可以使用此策略。

     

如果Extra列也显示Using where,则表示该索引用于执行键值的查找。如果没有Using where,优化器可能正在读取索引以避免读取数据行但不使用它进行查找。例如,如果索引是查询的覆盖索引,则优化程序可以扫描它而不使用它进行查找。

据我所知,Using index仅表示读取key列中指定的索引足以获得计算结果所需的所有数据;没有必要读取表数据。它没有说明如何使用索引信息。

Using where表示将从key列中提到的索引读取的值与输出的ref列中指示的列或常量的值进行比较。 ref列包含const, const,因为用于比较的值是字符串常量('3''123')。