我的问题的简短版本是索引一个列的三个索引和索引三列的索引之间的区别是什么。 背景如下。
我主要是程序员,但必须做DBA工作,因为我们没有DBA。 我正在评估我们的索引与对特定表运行的查询。 该表为3列,我经常过滤或获得最大值。 大多数时候查询看起来像
select max(col_a) from table where col_b = 'avalue'
要么
select col_c from table where col_b = 'avalue' and col_a = 'anothervalue'
所有列都是独立索引的。 我的问题是,如果我有一个索引col_b和col_a索引在一起的索引,我会看到任何区别,因为它们可以一起出现在where子句中吗?
对于这些问题的简单例子,很容易判断哪个更好。 对于真实世界的情况,您的里程可能会根据查询的其他部分显着变化。
在MySQL和其他数据库中,您可以在(col_b,col_a)上创build一个索引,并将其用于两个查询 – 多列索引的最左侧部分本身就是一个索引。 (col1,col2,col3)上的索引也是(col1)和(col1,col2)上的索引。
要回答你的具体问题,我想你会从col_b和col_a索引在一起获得显着的好处。 如果坚持每列的独立索引,则会发生以下两种情况之一 – 数据库使用其中一个索引来考虑匹配其中一个值的行的子集,然后扫描它们以获取第二个值,或者一些花哨的即时索引合并来模拟两列的索引。 MySQL 4会做前者,而MySQL可以做后者。 无论在哪种情况下,您都可以创build组合索引,因为您期望使用它。
在MySQL中,大多数情况下一个索引速度更快。 你可以在这里看到一些基准:
http://www.mysqlperformanceblog.com/2008/08/22/multiple-column-index-vs-multiple-indexes/