MySQL 排序 mysql的order by和group by 优化
sql语句:select id ,name ,age,address from user order by name;
上面是个语句很明显不能走索引,只能进行filesort,也就是借助
mysql有两种排
上面是个语句很明显不能走索引,只能进行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限定了。 (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |