在我的表格中,我有两个密切相关的A栏和B栏。我应该考虑哪些因素来决定是否要创作:
如果我:
,这会如何变化where A = 5 and B = 10
之类的查询(绝不喜欢where A = 5
),where A > 3 and A < 10 and B > 12 and B < 20
,order by (A, B)
,group by (A, B)
?注意:我故意没有提供有关我的特定案例的更多详细信息,因为我想要一个也会为其他人服务的一般答案。我使用的是mysql,但是如果你给出更一般的答案,一般来说这将是很好的。
答案 0 :(得分:5)
好的,当你有索引(A,B)时,MySQL也可以将它用作索引(A)。声明AB和A毫无意义。然而,声明AB和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)
的索引。订单很重要!