在某些情况中,MySQL通过访问索引就可以得到结果,此类查询的 EXPLAIN 输出显示 Extra 列的值为 Using index for group-by。 一、松散索引扫描 The most efficient way to processGROUP BYis when an index is used to directly retrieve the grouping columns. With this access method, MySQL uses the property of...
如果select 语句执行过程中使用了松散索引扫描实现 group by,explain 输出结果的 Extra 列会显示Using index for group-by。 松散索引扫描用于 min()、max(),可以减少需要读取的记录数;用于 count(distinct)、sum(distinct)、avg(distinct) ,可以对记录去重,避免使用临时表去重。 我们以min()为例介绍松散索引扫描的...
因此使用索引进行 group by 的最重要的前提条件是所有 group by 的参照列(分组依据的列)来自于同一个索引,且索引按照顺序存储所有的 key(即BTREE index,而HASH index没有顺序的概念)。 MySQL 有两种索引扫描方式完成 group by 操作,分别是松散索引扫描和紧凑索引扫描以及临时表实现 group by。在松散索引扫描方式下...
下面我们通过一个示例来描述松散索引扫描实现 GROUP BY,在示例之前我们需要首先调整一下 group_message 表的索引,将 gmt_create 字段添加到 group_id 和 user_id 字段的索引中: 然后再看如下 Query 的执行计划: 我们看到在执行计划的 Extra 信息中有信息显示“Using index for group-by”,实际上这就是告诉我们,...
对于GROUP BY在使用索引上的优化,分为两种情况讨论: 表上无索引。执行时,会生成临时表进行分组。可以通过索引来优化,来避免使用临时表。 表上有索引。GROUP BY 语句有几种扫描算法: 松散索引扫描(Loose Index Scan) 紧凑索引扫描(Tight Index Scan)
FROM group_message WHERE user_id>1 and abc=1 GROUP BY group_id,user_id; 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 松散索引扫描,此类查询的EXPLAIN输出显示Extra列的Using index for group-by ...
我们用 explain 分析包含 group by 的 select 语句时,从输出结果的 Extra 列经常可以看到 Using temporary; Using filesort。看到这个,我们就知道 MySQL 使用了临时表来实现 group by。 使用临时表实现 group by,成本高,执行慢。如果能够利用索引中记录已经排好序的特性,使用索引来实现 group by,那就是鸟枪换炮...
如果select 语句执行过程中使用了松散索引扫描实现 group by,explain 输出结果的 Extra 列会显示Using index for group-by。 松散索引扫描用于 min()、max(),可以减少需要读取的记录数;用于 count(distinct)、sum(distinct)、avg(distinct) ,可以对记录去重,避免使用临时表去重。
*** 1. row *** id: 1 select_type: SIMPLE table: tbl partitions: NULL type: range possible_keys: k key: k key_len: 4 ref: NULL rows: 2 filtered: 100.00 Extra: Using index for group-by 1 row in set, 1 warning (0.00 sec) mysql> select k,max(id) from tbl group by k; +...