带有 WHERE 和 GROUP BY 的复合索引

Sta*_*512 -3 index group-by

对于此查询:

SELECT * FROM dogs WHERE a = ? AND b = ? GROUP BY c
Run Code Online (Sandbox Code Playgroud)

哪个综合指数更好:

INDEX(a, b, c)
Run Code Online (Sandbox Code Playgroud)

或者

INDEX(c, a, b)
Run Code Online (Sandbox Code Playgroud)

Cha*_*ace 5

您通常需要第一个索引

INDEX(a, b, c)
Run Code Online (Sandbox Code Playgroud)

或类似的

INDEX(b, a, c)
Run Code Online (Sandbox Code Playgroud)

这是因为随后可以查找a和列(仅读取确切的必要行),并且结果仍将按 排序,这意味着不需要支持排序。bcGROUP BY


而另一个选择

INDEX(c, a, b)
Run Code Online (Sandbox Code Playgroud)

意味着虽然数据可以按 排序c,但需要读取全部行并验证它们是否符合ab条件。


如果您的 RDBMS 支持的话,您可能还想添加INCLUDE列,以便支持其余的SELECT列。