【问题标题】:Indexes on a database table, one column common数据库表上的索引,一列通用
【发布时间】:2017-09-06 04:12:44
【问题描述】:

我试图了解在以下情况下使用两个单独的索引是否有意义:

ColumnA, ColumnB, ColumnC

我有疑问

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

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

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

另外,如果ColumnA + ColumnB 上有一个索引,并且如果出现一个查询,其中ColumnB 是第一个,ColumnA 是第二个,是否会使用这个索引?

【问题讨论】:

  • "如果我只在 ColumnA 上创建一个索引,这对两个查询都有帮助吗?" 我想你的意思是问是否应该在 ColumnB 上创建一个索引?查询有共同的 ColumnB,而不是 ColumnA。
  • 对不起,我想我打错了。 A 列很常见。

标签: mysql sql indexing


【解决方案1】:

(@Haney 从一个角度讨论这个问题;这里是另一个。)

2 个索引还不错; 10 个索引正在进入“索引过多”的灰色地带。

INDEX(A) 帮助您的两个查询。

INDEX(A,B) 非常适合您的一个查询,而 帮助 处理另一个查询。如果您想将其保留在单个索引中,这可能是最佳选择。

但是...如果BTEXT 列,由于大小限制,您将不能使用INDEX(A,B)。而且,虽然可以使用“前缀”INDEX(A, B(22)),但可能并不比 INDEX(A) 更好。

不要打扰INDEX(A,B,C)。这对于带有 A 和 B 的查询很有用,但对于另一个查询,它并不比 INDEX(A) 好。

【讨论】:

    【解决方案2】:

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

    此外,创建一个 更深 的索引(例如 ColumnA, ColumnC)也应该对这两个查询都有帮助,因为 ColumnA 组件仍然首先被索引。

    我建议评估最常选择哪一列:ColumnBColumnC,并使用 ColumnA 对其应用索引。

    举个例子:假设ColumnBColumnA 查询中只有10% 被访问,而ColumnC 被访问90%。在这种情况下,我会将索引设置为ColumnA, ColumnC。它将帮助 100% 的 AC 查询,并且可能(我在 MySQL 中不是 100% 确定)也会帮助 AB 查询,因为系统通常足够聪明(至少在 MSSQL 中)可以使用 AC 索引来选择AB 查询中的ColumnA 数据(但仍在对ColumnB 组件进行全面扫描)。

    顺便说一下,这些类型的索引被称为覆盖索引,因为您的查询只选择索引数据中包含的列(这也是一个轻微的优化)。

    最好的读取性能是 2 个索引(每组一个),但是正如您正确指出的那样,这会稍微减慢插入、更新和删除的速度。但在大多数情况下,您可能会注意到这还不够。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      相关资源
      最近更新 更多