数据库表上的索引,一列常见

时间:2017-04-10 23:59:59

标签: mysql sql indexing

我试图理解在以下场景中是否有两个单独的索引是有意义的:

ColumnA, ColumnB, ColumnC

我有疑问

1.  where ColumnA = xxx and columnB = xxx
2.  where ColumnA = xxx and ColumnC = xxx

如果我只在ColumnA上创建一个索引,这对两个查询都有帮助吗?或者我应该在ColumnA + ColumnBColumnA + ColumnC上的Index2创建两个索引Index1。

我知道有两个索引可以证明更好,但我试图保持索引数量较低,因为表格相当大,但columnA相当独特。 ColumnA过滤特定实体的数据,该实体只能始终深入研究该数据。

此外,如果ColumnA + ColumnB上有索引,并且如果查询出现ColumnB是第一个而ColumnA是第二个,那么是否会使用此索引?

2 个答案:

答案 0 :(得分:2)

通常,在ColumnA上创建索引应仅对两个查询都有帮助。大多数RDBMS事物(MSSQL,MySQL等)中的索引都是b树结构。该键允许快速向下看,仅在一个方向上。

此外,创建更深层索引(例如ColumnA, ColumnC)也应该有助于两个查询,因为ColumnA组件仍然是首先编入索引。

我建议您评估最常选择的列:ColumnBColumnC并使用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)非常适合您的某个查询,而帮助使用其他查询。如果您想将其保留为单个索引,这可能是最佳选择。

但是......如果BTEXT列,由于尺寸限制,您将无法使用INDEX(A,B)。并且,使用"前缀" INDEX(A, B(22))虽然可能,但可能不会比INDEX(A)更好。

不要为INDEX(A,B,C)而烦恼。这对于使用A和B的查询很有用,但对于其他查询,它不比INDEX(A)好。