如果我有一个带有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
并且我不知道这究竟意味着什么。
答案 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”是否为真。过滤器最终使用索引和显式记录过滤的组合。
顺便说一下,如果要处理两列的所有组合,则需要多个索引:
答案 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