如果该字段上已存在多列索引,是否需要向表中添加新的单列索引?


10

我有一个UNIQUE_job_id__和上具有多列索引的表__keyword_id__

__job_id__如果我GROUP BY在该列上执行频繁查询,是否还需要添加另一个索引?

(在一亿行中可能要花一些时间。这就是为什么我要问的不只是这样做)


如果您真正的问题是关于慢查询的问题,请提供SHOW CREATE TABLE SHOW TABLE STATUS的显示变量,例如'%buffer%'。SELECT SELECT ...有多少可用内存?有许多可能的原因。通过查看这些项目可以发现大多数。
瑞克·詹姆斯

Answers:


5

一点都不 !!!如果所需的主列在索引的最左侧,则MySQL Query Optimizer将做正确的事情。如果您确实创建了这样的索引,则如果您始终执行GROUP BY job_id,keyword_id,则MySQL Query Optimizer可能会选择不使用该索引。如果仅通过job_id收集记录,则MySQL Query Optimizer可能会使用索引,也可能不会使用索引,但是无论如何,您都会有多余的索引浪费空间。

如果表是MyISAM,则建立这样的索引只会使MYI文件膨胀。

如果该表是InnoDB且innodb_file_per_table为0,则建立这样的索引只会使ibdata1膨胀。

如果表是InnoDB,而innodb_file_per_table是1,则建立这样的索引只会使表的.ibd文件膨胀。

总而言之,您无需添加该额外索引!


你确定吗?这个人另外建议:stackoverflow.com/questions/179085/…还是从MySQL到MSSQL不同?
Tadej

4

索引只能group by通过减少排序来加快操作-如果使用的索引是聚簇索引或至少具有与聚簇索引相同的前导列,这将更加高效。在所有这一切中,我假设MySQL没有等同于hash group by通常会绕过索引的任何好处的操作-也许其他人可以确认这一点。

job_id假设有单独的索引是该group by子句中的唯一列,而聚集索引也不是,则有一个单独的索引是有好处的:索引会更小,因此对其进行扫描将生成更少的I / O

- 编辑 -

作为索引包含所有聚集索引键定义的主键字段不在二级索引,对索引job_id只会比上的折射率小job_id, keyword_id,如果keyword_id是不聚集的索引的一部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.