加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL 排序 mysql的order by和group by 优化

发布时间:2022-10-17 14:02:09 所属栏目:MySql教程 来源:转载
导读: 假设 id字段是主键 ,其他的字段没有所有
sql语句:select id ,name ,age,address from user order by name;
上面是个语句很明显不能走索引,只能进行filesort,也就是借助
mysql有两种排

假设 id字段是主键 ,其他的字段没有所有
sql语句:select  id ,name ,age,address from user  order by name;

上面是个语句很明显不能走索引,只能进行filesort,也就是借助

mysql有两种排序算法:单路排序和双路排序

在解释这两种算法之前,要了解的是mysql有个专门的内存区域是sort buffer,用来排序。MySQL 通过比较系统变量 max_length_for_sort_data(默认1024字节) 的大小和需要查询的字段总大小来判断使用哪种排序模式。

如果 字段的总长度小于max_length_for_sort_data ,那么使用 单路排序模式;

如果 字段的总长度大于max_length_for_sort_data ,那么使用 双路排序模?式。

单路排序:mysql会一次性取出所有字段进行MySQL 排序,然后放入到sortbuffer中,排完序之后返回给客户端

双路排序:mysql会取出要排序的字段和主键值,排完序之后,进行回表查询,再把数据返回给客户端

从这个地方来说:进行不要用 select *,需要什么字段就查询什么字段,减少双路排序。

也可以调大一些max_length_for_sort_data 值,减少双路排序。

如果一次性需要排序的数据比较到怎么办?也就是排序的数据大小超过了sortbuffer的大小,还要用到文件排序。

但是如果要排序的字段是有索引的,也就是有序的,就不需要排序了,这也就是为什么要求排序的字段要有索引

注意,如果全部使用sort_buffer内存排序一般情况下效率会高于磁盘文件排序,但不能因为这个就随便增大sort_buffer(默认1M),mysql很多参数设置都是做过优化的,不要轻易调整。

优化总结:

1、MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序。index

效率高,filesort效率低。

2、order by满足两种情况会使用Using index。

1) order by语句使用索引最左前列。

2) 使用where子句与order by子句条件列组合满足索引最左前列。

3、尽量在索引列上完成排序,遵循索引建立(索引创建的顺序)时的最左前缀法则。

4、如果order by的条件不在索引列上,就会产生Using filesort。

5、能用覆盖索引尽量用覆盖索引

6、group by与order by很类似,其实质是先排序后分组,遵照索引创建顺序的最左前缀法则。对于group

by的优化如果不需要排序的可以加上order by null禁止排序。注意,where高于having,能写在where中

的限定条件就不要去having限定了。

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!