【问题标题】:Indexes on fields with low amount of possible values具有少量可能值的字段的索引
【发布时间】:2016-04-04 13:37:57
【问题描述】:

我有一个包含数百万条记录的表,我将在 FieldAFieldB 上使用 Where 进行选择。 FieldA 有数千个可能的值,而 FieldB 只有 5 个。我最好不要:

  1. 在每条记录上添加索引,即 Index(A)、Index(B)
  2. 仅在 FieldA 上添加索引
  3. 添加分组索引,即 Index(A,B)

【问题讨论】:

    标签: mysql optimization indexing


    【解决方案1】:

    我建议你在两个字段上都使用复合索引

     index my_index_name on my_table(fieldA, fieldB)
    

    在第一个位置使用 fieldA 或 FieldB 应该会以一种特别的方式改变性能..,但首选最有选择的第一个

    【讨论】:

      【解决方案2】:

      如果您使用的是WHERE A=(constant) AND B=(constant),那么INDEX(A,B)INDEX(B,A) 也同样适用。

      但是...OR 搞砸了。 < 搞砸了。 IN 搞砸了。等等等等。

      WHERE ... AND ... 构建“最佳”索引的简短规则

      1. = (constant) 收集所有列first
      2. 然后您可以添加一个更多涉及范围的列,等等。

      示例:WHERE A < 123 AND B = 987 可以从INDEX(B, A) 中受益最大按此顺序

      如果您在一个查询中有WHERE A=333,而在另一个查询中有WHERE B=777(没有AND'd),那么您需要两个索引,一个(A)(或开始 em> 与 A),以及与 B 类似的一个。INDEX(B, A)对两者都有效。

      More tips.

      【讨论】:

      • 优秀的输入谢谢。我一直不太明白什么时候做 Index(A,B) vs Index(A), Index(B) 但从您的回复看来,基本规则是 1)A 和 B 需要在同一个查询中使用,2)把有常数的放在第一位。
      猜你喜欢
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 2018-10-29
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多