Group by
group by逻辑正常需要构造一个带唯一索引的临时表,执行代价都是比较高的。
优化
- 如果对group by语句的结果没有排序要求,要在语句后面加order by null;
- 尽量让group by过程用上表的索引,确认方法是explain结果里没有Using temporary和Using filesort;
- 如果group by需要统计的数据量不大,尽量只使用内存临时表:也可以通过适当调大tmp_table_size参数,来避免用到磁盘临时表;
- 如果数据量实在太大,使用SQL_BIG_RESULT这个hint,来告诉优化器直接使用排序算法得到group by的结果
排序
全字段排序
将字段放入sort_buffer(有序数组)做排序,内存不够时会使用磁盘临时文件
rowid排序
单行长度太大时,此时只会将排序字段和主键放入sort_buffer排序,最后再回表查出所需的字段