什么是MYSQL中的一个索引优于两个

时间:2011-12-11 01:22:21

标签: mysql performance indexing multiple-columns

我已经了解了当您制作多列索引时订单的重要性以及通常您希望WHERE子句中出现的列优先于其他ORDER BY等的列。但是,赢了&t如果你只是单独索引每个人,你也会加快速度吗? (显然不是因为我自己的实验表明,组合索引行为可能比简单地将每个索引行为单独编入索引要快得多)。什么时候应该使用多列索引以及哪些类型的查询会增加?

3 个答案:

答案 0 :(得分:3)

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

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

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

  

MySQL可以对测试所有内容的查询使用多列索引   索引中的列,或仅测试第一列的查询,   前两列,前三列,依此类推。如果你指定   索引定义中的列顺序正确,单个   复合索引可以加快几种查询的速度   表

答案 1 :(得分:2)

简短的回答是,“这取决于。”

答案很长:如果你有时会这样做

 WHERE COL1 = value1 and COL2 = value2

有时会这样做

 WHERE COL1 = value1

但从未,或几乎从未做过

 WHERE COL2 = value2

然后(COL1,COL2)的复合指数将是您的最佳选择。 (对于mySQL以及DBMS的其他品牌和型号都是如此。)

更多索引会降低INSERT和UPDATE操作的速度,因此它们不是免费的。

答案 2 :(得分:1)

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

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