MySQL中多列索引的效率

时间:2012-08-28 17:31:10

标签: mysql indexing explain multiple-columns

如果我有一个带有3列索引的MyISAM表,比如

create table t (
  a int,
  b int,
  c int,
  index abc (a, b, c)
) engine=MyISAM;

问题是,以下查询是否可以充分利用索引:

select * from t where a=1 and c=2;

换句话说,考虑到索引是一个b树,MySQL可以跳过中间的列并仍然在第一列和最后一列上快速搜索吗?

EXPLAIN确实显示将使用该索引,但Extra说:Using where; Using index并且我不知道这究竟意味着什么。

2 个答案:

答案 0 :(得分:3)

答案是“不”。

MySQL文档非常清楚如何使用索引:

如果表具有多列索引,则优化程序可以使用索引的任何最左前缀来查找行。例如,如果您在(col1,col2,col3)上有一个三列索引,则在(col1),(col1,col2)和(col1,col2,col3)上索引搜索功能。( http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html。)

索引用于“a = 1”会发生什么。加载所有匹配的记录,以查看“c = 2”是否为真。过滤器最终使用索引和显式记录过滤的组合。

顺便说一下,如果要处理两列的所有组合,则需要多个索引:

  • (a,b,c)
  • (b,a,c)
  • (c,b,a)

答案 1 :(得分:0)

  

即使您正在为WHERE子句的所有部分使用索引,也可以   可能会看到如果列可以为NULL,请使用where。

根据MySQL文档,上面的语句澄清了表中的列可能为null,因此它也显示using where,尽管它具有where子句中字段的覆盖索引。

http://dev.mysql.com/doc/refman/5.1/en/explain-output.html#explain-extra-information