JIStone Asked: 2011-05-18 14:58:33 +0800 CST2011-05-18 14:58:33 +0800 CST 2011-05-18 14:58:33 +0800 CST 如果该字段上的多列索引已经存在,我是否需要向表中添加新的单列索引? 772 我有一个在 和 上有一个多列索引UNIQUE的表。_job_id____keyword_id__ __job_id__如果我有一个GROUP BY在该列上执行的频繁查询,我是否还需要添加另一个索引? (在 1 亿行可能需要一段时间。这就是为什么我要问而不是只做) mysql index 2 个回答 Voted Best Answer RolandoMySQLDBA 2011-05-18T15:02:14+08:002011-05-18T15:02:14+08:00 一点都不 !!!如果需要的主列在索引的最左边,MySQL 查询优化器会做正确的事情。如果您确实创建了这样的索引,那么如果您始终执行 GROUP BY job_id,keyword_id,MySQL 查询优化器可能会选择从不使用该索引。如果您仅按 job_id 收集记录,MySQL 查询优化器可能会或可能不会使用索引,但是无论如何您都会有多余的索引浪费空间。 如果表是 MyISAM,那么创建这样的索引只会使 MYI 文件膨胀。 如果表是 InnoDB 并且 innodb_file_per_table 是 0,那么创建这样的索引只会使 ibdata1 膨胀。 如果表是 InnoDB 并且 innodb_file_per_table 是 1,那么创建这样的索引只会使表的 .ibd 文件膨胀。 总之,你不需要做那个额外的索引! Jack Douglas 2011-05-18T22:35:19+08:002011-05-18T22:35:19+08:00 索引只能通过减少排序group by来加速操作- 如果使用的索引是聚集索引或至少具有与聚集索引相同的前导列,这将更有效。在所有这一切中,我假设 MySQL 没有相当于通常会绕过索引的任何好处的操作 - 也许其他人可以证实这一点。hash group by job_id假设它是子句中的唯一列并且聚集索引也不是,拥有一个单独的索引有一个边际好处group by:索引会更小,因此扫描它会产生更少的 I/O - 编辑 - 由于索引包含为聚集索引键定义的所有不在二级索引中的主键字段,因此如果不是聚集索引的一部分,则上的索引job_id只会小于上的索引。job_id, keyword_idkeyword_id
一点都不 !!!如果需要的主列在索引的最左边,MySQL 查询优化器会做正确的事情。如果您确实创建了这样的索引,那么如果您始终执行 GROUP BY job_id,keyword_id,MySQL 查询优化器可能会选择从不使用该索引。如果您仅按 job_id 收集记录,MySQL 查询优化器可能会或可能不会使用索引,但是无论如何您都会有多余的索引浪费空间。
如果表是 MyISAM,那么创建这样的索引只会使 MYI 文件膨胀。
如果表是 InnoDB 并且 innodb_file_per_table 是 0,那么创建这样的索引只会使 ibdata1 膨胀。
如果表是 InnoDB 并且 innodb_file_per_table 是 1,那么创建这样的索引只会使表的 .ibd 文件膨胀。
总之,你不需要做那个额外的索引!
索引只能通过减少排序
group by
来加速操作- 如果使用的索引是聚集索引或至少具有与聚集索引相同的前导列,这将更有效。在所有这一切中,我假设 MySQL 没有相当于通常会绕过索引的任何好处的操作 - 也许其他人可以证实这一点。hash group by
job_id
假设它是子句中的唯一列并且聚集索引也不是,拥有一个单独的索引有一个边际好处group by
:索引会更小,因此扫描它会产生更少的 I/O- 编辑 -
由于索引包含为聚集索引键定义的所有不在二级索引中的主键字段,因此如果不是聚集索引的一部分,则上的索引
job_id
只会小于上的索引。job_id, keyword_id
keyword_id