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

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

发布时间:2022-10-19 15:49:18 所属栏目: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限定了。
 

(编辑:海洋资讯信息网_我爱站长网)

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