我已经阅读了有关当您创建多列索引时顺序很重要的信息,并且通常您希望将出现在 WHERE 子句中的列先于其他将出现在 ORDER BY 等中的列。但是,您不会也获得速度如果你只是单独索引每一个?(显然不是因为我自己的实验告诉我,组合索引行为比简单地单独索引每个索引行为要快得多)。什么时候应该使用多列索引,它会促进哪些类型的查询?
3 回答
3
对于所有标准都是多列索引的一部分的情况,多列索引将是最有效的——甚至比拥有多个单一索引更有效。
另外,请记住,如果您有一个多列索引,但不要使用由多列索引索引的第一列(或者不要从头开始并保持与先前使用的索引相邻),多列索引不会有任何好处。(例如,如果我对列 [B, C, D] 有一个索引,但有一个只使用 [C, D] 的 WHERE,那么这个多列索引将没有任何好处。)
参考: http ://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html :
MySQL 可以将多列索引用于测试索引中所有列的查询,或者只测试第一列、前两列、前三列等的查询。如果在索引定义中以正确的顺序指定列,则单个复合索引可以加快对同一张表的多种查询。
于 2011-12-11T01:27:06.490 回答
2
简短的回答是,“这取决于。”
长答案是这样的:如果你有时这样做
WHERE COL1 = value1 and COL2 = value2
有时做
WHERE COL1 = value1
但从不,或几乎从不,
WHERE COL2 = value2
那么 (COL1, COL2) 上的复合索引将是您的最佳选择。(对于 mySQL 以及其他品牌和型号的 DBMS 来说都是如此。)
更多索引会减慢 INSERT 和 UPDATE 操作,因此它们不是免费的。
于 2011-12-11T01:30:03.617 回答
1
复合索引 (c1,c2) 在以下情况下非常有用:
- c1=v1 AND c2=v2 的明显情况
- 如果您在 v2 和 v3 之间执行 WHERE c1=v1 AND c2 - 这将对复合索引进行“范围扫描”
- SELECT ... FROM t WHERE c1=v1 ORDER BY c2 - 在这种情况下,它可以使用索引对结果进行排序。
- 在某些情况下,作为“覆盖索引”,例如“SELECT c1,c2 FROM t WHERE c1=4”可以忽略表内容,只从索引中获取一个(范围)。
于 2011-12-11T06:18:54.713 回答