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-tree,MySQL可以跳过中间的列并且仍然对第一列和最后一列进行快速搜索吗?

EXPLAIN 似乎确实表明将使用该索引,但是,Extra 说:Using where; Using index我不知道这到底意味着什么。

4

2 回答 2

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)
于 2012-08-28T18:08:56.033 回答
0

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

根据MySQL文档,上面的语句阐明了表中的列可能为空,因此它也说明using where了它在 where 子句中具有覆盖字段的索引。

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

于 2012-08-28T17:44:16.277 回答