我试图理解在以下场景中是否有两个单独的索引是有意义的:
ColumnA, ColumnB, ColumnC
我有疑问
1. where ColumnA = xxx and columnB = xxx
2. where ColumnA = xxx and ColumnC = xxx
如果我只在ColumnA
上创建一个索引,这对两个查询都有帮助吗?或者我应该在ColumnA
+ ColumnB
和ColumnA
+ ColumnC
上的Index2创建两个索引Index1。
我知道有两个索引可以证明更好,但我试图保持索引数量较低,因为表格相当大,但columnA
相当独特。 ColumnA
过滤特定实体的数据,该实体只能始终深入研究该数据。
此外,如果ColumnA
+ ColumnB
上有索引,并且如果查询出现ColumnB
是第一个而ColumnA是第二个,那么是否会使用此索引?
答案 0 :(得分:2)
通常,在ColumnA
上创建索引应仅对两个查询都有帮助。大多数RDBMS事物(MSSQL,MySQL等)中的索引都是b树结构。该键允许快速向下看,仅在一个方向上。
此外,创建更深层索引(例如ColumnA, ColumnC
)也应该有助于两个查询,因为ColumnA
组件仍然是首先编入索引。
我建议您评估最常选择的列:ColumnB
或ColumnC
并使用ColumnA
对其应用索引。
示例:假设只有10%的ColumnB
次查询访问ColumnA
,而ColumnC
的访问次数为90%。在这种情况下,我会在ColumnA, ColumnC
上设置索引。它将帮助100%的AC查询,并且可能(我不是100%确定MySQL)也可以帮助AB查询,因为系统通常足够智能(至少在MSSQL中)使用AC索引来选择AB查询中的ColumnA
数据(但仍然对ColumnB
组件进行完整扫描)。
顺便提一下,这些索引称为覆盖索引,因为您的查询只选择索引数据中包含的列(这也是一种轻微的优化)。
最佳读取性能将是2个索引(每个索引一个),但正如您正确指出的那样,这会减慢插入,更新和删除的速度。但在大多数情况下,你可能不会注意到这一点。
答案 1 :(得分:2)
(@ Haney从一个角度讨论该问题;这是另一个观点。)
2个索引不是“坏”&#39 ;; 10个索引进入灰色区域"索引太多"。
INDEX(A)
帮助处理您的两个问题。
INDEX(A,B)
非常适合您的某个查询,而帮助使用其他查询。如果您想将其保留为单个索引,这可能是最佳选择。
但是......如果B
是TEXT
列,由于尺寸限制,您将无法使用INDEX(A,B)
。并且,使用"前缀" INDEX(A, B(22))
虽然可能,但可能不会比INDEX(A)
更好。
不要为INDEX(A,B,C)
而烦恼。这对于使用A和B的查询很有用,但对于其他查询,它不比INDEX(A)
好。