【问题标题】:When is one index better than two in MYSQLMYSQL 什么时候一个索引比两个好
【发布时间】:2011-12-11 01:22:20
【问题描述】:

我已经阅读了有关当您创建多列索引时顺序很重要的信息,并且通常您希望将出现在 WHERE 子句中的列先于其他将出现在 ORDER BY 等中的列。但是,您也不会如果您只是分别索引每个索引,可以加快速度吗? (显然不是因为我自己的实验告诉我,组合索引行为比简单地单独索引每个索引行为要快得多)。什么时候应该使用多列索引,它会促进哪些类型的查询?

【问题讨论】:

    标签: mysql performance indexing multiple-columns


    【解决方案1】:

    多列索引对于所有条件都是多列索引的一部分的情况最有效 - 甚至比拥有多个单一索引更有效。

    另外,请记住,如果您有一个多列索引,但不要使用由多列索引索引的第一列(或者不要从头开始并保持与先前使用的相邻索引),多列索引不会有任何好处。 (例如,如果我对列 [B, C, D] 有一个索引,但有一个只使用 [C, D] 的 WHERE,那么这个多列索引将没有任何好处。)

    参考:http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

    MySQL 可以使用多列索引来测试所有 索引中的列,或仅测试第一列的查询, 前两列,前三列,依此类推。如果您指定 索引定义中按正确顺序排列的列,单个 复合索引可以加速同一个查询的多种查询 表。

    【讨论】:

    • 第二条语句至少对于 SQL Server 不是 100% 正确,我怀疑对于 MYsql 也是如此......
    • @MitchWheat - 参考 MySQL 文档更新了答案,确认这是准确的。
    • 我指的是 colA、colB、colC 上的索引有时可以被 colB+colC 列上的查询使用,但 colA 上的索引不能使用
    • @Mitch 是对的。 SELECT * FROM t WHERE c=1 AND d=1 不会从 MySQL 中的 (b,c,d) 索引中受益。但是SELECT c,d FROM t WHERE b=1 AND d=1实际上可能会使用索引,因为可以从索引树中检索所有需要的数据,而无需从表中读取:dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html
    【解决方案2】:

    简短的回答是,“视情况而定。”

    长答案是这样的:如果你有时这样做

     WHERE COL1 = value1 and COL2 = value2
    

    有时会这样做

     WHERE COL1 = value1
    

    但从不,或几乎从不这样做

     WHERE COL2 = value2
    

    那么 (COL1, COL2) 上的复合索引将是您的最佳选择。 (适用于 mySQL 以及其他品牌和型号的 DBMS。)

    更多索引会减慢 INSERT 和 UPDATE 操作,因此它们不是免费的。

    【讨论】:

      【解决方案3】:

      复合索引 (c1,c2) 在以下情况下非常有用:

      1. c1=v1 AND c2=v2 的明显情况
      2. 如果您在 v2 和 v3 之间执行 WHERE c1=v1 AND c2 - 这将对复合索引执行“范围扫描”
      3. SELECT ... FROM t WHERE c1=v1 ORDER BY c2 - 在这种情况下,它可以使用索引对结果进行排序。
      4. 在某些情况下,作为“覆盖索引”,例如"SELECT c1,c2 FROM t WHERE c1=4" 可以忽略表内容,只从索引中获取一个(范围)。

      【讨论】:

        猜你喜欢
        • 2011-12-14
        • 2013-06-21
        • 2011-11-21
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多