【问题标题】:Shall I define index (A) and index (B), or index (A, B), or both?我应该定义索引 (A) 和索引 (B),还是索引 (A, B),或者两者都定义?
【发布时间】:2012-04-06 00:57:05
【问题描述】:

在我的表格中,我有两个密切相关的列 A 和 B。我应该考虑哪些可能的因素来决定是否创建:

  • 索引(A)和索引(B),
  • 索引(A,B),
  • 以上两种?

如果我:

  1. 只使用where A = 5 and B = 10 之类的查询(而永远不要使用where A = 5 之类的查询),
  2. 也可以使用 where A > 3 and A < 10 and B > 12 and B < 20 之类的查询,
  3. 经常使用order by (A, B)
  4. 经常使用group by (A, B)?

注意:我故意没有提供有关我的特定案例的更多详细信息,因为我想要一个通用的答案,也将对其他人有用。我使用 mysql,但如果您给出涵盖 SQL 的更一般的答案,那就太好了。

【问题讨论】:

  • 请注意,我已经阅读了this question,但它并没有涵盖我的所有问题。
  • 在查询中尽可能多地使用 EXPLAIN,并尝试各种索引配置。这应该很有启发性!

标签: mysql sql database indexing


【解决方案1】:

(A,B) 上的索引将处理您的案例 1、3 和 4。

对于案例 2,您在 AB 上都有范围查询,最好在 (A) 上建立一个索引,在 (B) 上建立一个单独的索引,让数据库决定哪个最适合查询。它可以根据查询中的值即时决定哪个索引更具选择性。在这种情况下,MySQL 将只使用一个索引,因此它会选择它认为会给它的给定范围内的最小行集的索引,然后将遍历那些按另一个范围过滤的行。

因此,为了处理您提到的所有这些情况,我建议使用以下索引:

  • (A,B)
  • (B)

(A,B) 上的索引可以像 (A) 上的索引一样使用,只要数据库需要 (A) 上的索引,因此定义这两个索引就像设置“以上所有”一样(A)(B)(A,B)

还请注意,如果您想按(B, A) 排序或分组,您需要在(B,A)(A,B) 上建立索引。顺序很重要!

【讨论】:

    【解决方案2】:

    好的,当你有一个索引(A,B)时,MySQL 也可以将它用作索引(A)。声明 AB 和 A 没有意义。然而,声明 AB 和 B 确实如此

    所以你有以下选择:

    1. 索引(A,B)
    2. 索引(A,B)和索引(B)
    3. 索引(A)和索引(B)

    【讨论】:

    • 好的,谢谢!但你的意思是 3 个选择,还有 Index(A,B) 一个人?
    • 如果您在没有A 列的情况下从不搜索B 列,您也可以单独使用Index(A,B)。需要记住的是,Index(A,B) 不能单独用于搜索 B。这是合乎逻辑的:想想关于姓氏和名字的字典:找到所有名字为“thomas”的人会很困难。
    • 感谢 Konerak。但是查询 2:where A > 3 and A < 10 and B > 12 and B < 20 呢?不是需要为 B 单独索引的情况吗?
    • 不,将其视为字典(或 Excel 表):首先,查找第一列中的值在 3 到 10 之间的所有行。然后,对于每个值,找到第二列中的值在 12 到 20 之间的行。 MySQL 使用索引,不管你是否使用 =>LIKE "12%"...(它不会使用索引LIKE "%12%" 虽然)
    • @tombom:需要引用。反引用:index merge
    【解决方案3】:

    如果您始终在 WHERE / GROUP BY / ORDER BY 中使用两列(或索引的第一列),则应使用 index(A,B)

    索引中的第二个(在这种情况下是B)不能单独使用,但第一个可以(无论如何只能是第一个)。

    因此,如果您从不单独使用 B,那么 index(A,B) 应该就足够了。如果您从不单独使用 A,但确实使用了 B,那么请使用 index(B,A)。如果您确实单独使用两者,但主要是一起使用,则单独添加另一个索引。

    【讨论】:

    • 感谢 Topener,但是查询 2.where A > 3 and A < 10 and B > 12 and B < 20 呢?不是需要为 B 单独索引的情况吗?
    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2012-07-19
    • 2021-08-06
    相关资源
    最近更新 更多