2012-08-28 53 views
1

如果我有一个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,我不知道这是什么意思。

回答

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)
0

即使您对某个WHERE子句的所有部分使用索引, 也可能会看到如果该列可以为NULL,则使用where。

MySQL文档,上面的语句阐明了在表中的列可以为空,因此它说using where以及尽管它已经在where子句覆盖索引字段。

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

+0

谢谢,但没有,在我的情况下,没有列可以是NULL。所以看起来像'使用where'就意味着它不能完全使用我的索引? – mojuba