我的覆盖索引包含字段a
b
和c
,按顺序排列。
ALTER TABLE table ADD INDEX covering(a, b, c)
以下查询使用覆盖索引,更具体地说,仅使用覆盖索引中的第一个字段。
SELECT * FROM table
GROUP BY a
如果我创建了另一个专门包含a
的索引,我会观察到性能提升吗?
ALTER TABLE table ADD INDEX a(a)
或者上述索引的工作方式与SELECT
语句中的覆盖索引完全相同吗?
如果我的查询是GROUP
在覆盖索引中不是第一个字段的字段会怎么样?
SELECT * FROM table
GROUP BY b
我的索引是
ALTER TABLE table ADD INDEX b(b)
答案 0 :(得分:1)
如果您在(a, b, c)
上有复合索引并使用ORDER BY a
,那么它将起作用并使用该索引。仅在(a)
上添加索引将使查询计划程序更加可取,但由于必须在索引中保留更多数据,并且在表更新时更新两个索引,因此这将是浪费。使用较窄的索引会有很小的收益,但可能难以量化这种优势。
对于使用ORDER BY b
进行查询,它无法使用上述任何索引,您必须在(b)
上创建索引或在(b, ...)
上创建复合索引以获得合理的性能。