单个索引中的多个列与多个索引

单个索引中的多个列与多个索引

我的问题的简短版本是三个索引(每个索引索引一个列)和一个索引索引三个列之间有什么区别。背景如下。

我主要是一名程序员,但必须做 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 子句中?

答案1

对于此类问题的简单示例,很容易判断哪个更好。在实际情况下,您的里程可能会根据查询的其他部分而有很大差异。

在 MySQL 以及其他数据库中,您可以创建 (col_b, col_a) 上的索引并将其用于两个查询 - 多列索引的任何最左侧部分本身都是索引。 (col1, col2, col3) 上的索引也是 (col1) 和 (col1, col2) 上的索引。

为了回答您的具体问题,我认为将 col_b 和 col_a 一起索引将为您带来巨大好处。如果您坚持只使用每个列的独立索引,则会发生以下两种情况之一 - 要么数据库使用其中一个索引来考虑与其中一个值匹配的行子集,然后扫描它们以查找第二个值,要么进行一些花哨的即时索引合并以模拟两个列上的索引。MySQL 4 会执行前者,而 MySQL 可以执行后者。在这两种情况下,您不妨创建组合索引,因为您希望使用它。

答案2

在 MySQL 中,大多数情况下单个索引速度更快。您可以在此处看到一些基准测试:

http://www.mysqlperformanceblog.com/2008/08/22/multiple-column-index-vs-multiple-indexes/

相关内容