【问题标题】:Efficiency of multicolumn indexes in MySQLMySQL中多列索引的效率
【发布时间】:2012-08-23 06:29:03
【问题描述】:

如果我有一个带有 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 我不知道这到底意味着什么。

【问题讨论】:

    标签: mysql indexing explain multiple-columns


    【解决方案1】:

    答案是“不”。

    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)

    【讨论】:

      【解决方案2】:

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

      根据MySQL 文档,上述语句阐明了您的表中的列可能为空,因此它也显示using where,尽管它在 where 子句中包含字段索引。

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

      【讨论】:

      • 谢谢,但不,在我的情况下,所有列都不能为 NULL。所以看起来像using where 只是意味着它不能完全使用我的索引?
      猜你喜欢
      • 2013-01-28
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 2014-03-22
      • 2011-03-04
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多