我应该定义索引(A)和索引(B),或索引(A,B),还是两者都定义?

时间:2012-03-21 13:37:36

标签: mysql sql database indexing

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

  • 索引(A)和索引(B),
  • index(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. 等查询
  4. 经常使用order by (A, B)
  5. 经常使用group by (A, B)
  6. 注意:我故意没有提供有关我的特定案例的更多详细信息,因为我想要一个也会为其他人服务的一般答案。我使用的是mysql,但是如果你给出更一般的答案,一般来说这将是很好的。

3 个答案:

答案 0 :(得分:5)

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

所以你有这些选择:

  1. 指数(A,B)
  2. 指数(A,B)和指数(B)
  3. 指数(A)和指数(B)

答案 1 :(得分:4)

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

索引中的第二个(在本例中为B)不能单独使用,但第一个可以(在任何情况下只有第一个)。

因此,如果您从不使用B,那么index(A,B)就足够了。如果你从不使用A,但你确实使用B,那么请index(B,A)。如果您同时使用两者,但大多数一起使用,则分别添加其他索引。

答案 2 :(得分:2)

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

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

因此,为了处理您提到的所有案例,我建议使用索引:

  • (B)
  • (A,B)

(B)上的索引就像(A,B)上的索引一样,只要数据库需要(A)上的索引,所以定义这两个索引就像有一个“以上所有“(A)(A)(B)

另请注意,如果您想按(A,B)订购或分组,则需要(B, A)以及(B,A)的索引。订单很重要!