5

如果我在 (a, b) 上有一个复合索引,我了解仅与“a”相关的查询仍将使用复合索引(但不与“b”相关的查询)

我的问题是,如果我有 (a, b) 索引,是否有任何正当理由在“a”上有一个单列索引?关于 (a,b) 索引是完全替代 a 还是仅仅是“聊胜于无”的索引,我所读到的内容似乎含糊不清。

这假设我同时按 a 和 a,b 进行过滤。我有一个表有太多的索引,这会损害写入性能,并且想要在删除索引之前仔细检查,我只是相当确定这些索引没有任何好处。

另外,这个答案是否会根据我使用的是 InnoDb 还是 MyISAM 而改变?涉及的表是 MyISAM,但我们的大多数表都是 InnoDb。

4

2 回答 2

4

您的 (a,b) 索引还将处理仅涉及“a”的查询,并且不需要单独在 (a) 上建立索引。

文档中

如果表有一个多列索引,优化器可以使用索引的任何最左边的前缀来查找行。

例如,如果您在 (col1, col2, col3) 上有一个三列索引,则您在 (col1)、(col1, col2) 和 (col1, col2, col3) 上有索引搜索功能。

于 2011-02-16T22:39:08.093 回答
2

我的问题是,如果我有 (a, b) 索引,是否有任何正当理由在“a”上有一个单列索引?

不,如果您在 (a,b) 上有索引,则没有理由在 (a) 上有索引

于 2011-02-16T22:38:19.637 回答