Mysql group by
临时表与内存表
内存表是 Memory 引擎表,表的数据行都在内存。
临时表可以使用各种引擎。
临时表是线程私有表,其他线程不可见,不需考虑重名问题。
session 结束时临时表会被自动删除。
如果 Binlog_format = row,则临时表语句不进入 binlog,不参与主从同步。
普通表的 table_def_key = 库名 + 表名。
临时表的 table_def_key = 库名 + 表名 + mysql实例 id + 线程 id。
内部临时表
Mysql 的一些操作需要临时存储数据,会用到临时表。比如 union 去重求交集。它将两个子查询的结果放入临时表,去重之后返回客户端。如果是 union all 求并集,就不需要临时表。
group by 分组也用到临时表。group by 分组默认排序,如果不需要排序,可以 sql 语句末尾添加 order by null
。
group by 无法判断分组字段是否有序,因此用到临时表。而索引是有序的,如果 group by 索引字段
就不会使用临时表,省去排序时间。