【问题标题】:Proper field orders for covering index - MySQL覆盖索引的正确字段顺序 - MySQL
【发布时间】:2011-01-26 00:07:52
【问题描述】:

在 MySQL 中为表创建覆盖索引是否有标准顺序?这意味着如果我的查询具有 where 子句、order by 和 select 语句中的字段,我将按什么顺序将字段添加到索引中以正确创建覆盖索引?

【问题讨论】:

    标签: sql mysql indexing covering-index


    【解决方案1】:

    覆盖索引采用逗号分隔列表中的列列表。从左侧开始遍历/查看此列表。如果不使用最左边的列,则不使用索引。意思是,有一个像这样的列列表:

    col_a, col_b, col_c
    

    如果查询不包含对col_a 的引用,则不会使用它。如果顺序改为:

    col_c, col_b, col_a
    

    ...那么col_c 需要在查询中引用。继续使用第二个覆盖索引列示例,col_bcol_a 不必在查询中,但评估从左到右逐列移动。

    索引使用的列引用可以在以下子句中:

    • 选择
    • 在哪里
    • 分组依据
    • 订购人

    参考:

    【讨论】:

    • 那么如果我有一个 where 子句,然后在索引中添加 where 子句中的字段,然后在 select 语句中添加所有字段?
    • @John:列引用可以跨越我提到的任何条款。也就是说,索引的存在并不能保证它会被使用 - 表统计信息在索引选择中发挥作用。
    【解决方案2】:

    MySQL Optimization 7.5.2 Multiple-Column Indexes 说:

    MySQL 使用多列索引的方式是,当您在 WHERE 子句中为索引的第一列指定已知数量时,即使您没有为其他列指定值,查询也会很快。

    链接页面上的示例还指出,如果您没有为索引中的第一列指定值,则索引未使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2010-11-18
      相关资源
      最近更新 更多