如果我为已经在覆盖索引中编入索引的单个字段创建了单独的索引,我会观察到性能提升吗?

时间:2012-12-03 04:59:44

标签: mysql

我的覆盖索引包含字段a bc,按顺序排列。

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)

1 个答案:

答案 0 :(得分:1)

如果您在(a, b, c)上有复合索引并使用ORDER BY a,那么它将起作用并使用该索引。仅在(a)上添加索引将使查询计划程序更加可取,但由于必须在索引中保留更多数据,并且在表更新时更新两个索引,因此这将是浪费。使用较窄的索引会有很小的收益,但可能难以量化这种优势。

对于使用ORDER BY b进行查询,它无法使用上述任何索引,您必须在(b)上创建索引或在(b, ...)上创建复合索引以获得合理的性能。