MySql--Order By 和Group By优化

Order By
1 排序往往都会出现文件排序,可以通过索引来优化排序,
在这里插入图片描述
与查询一样,同样需要满足最左前缀原则,即用到的索引列开头列不能断,中间不能断。。。仔细观察如下案例。
在这里插入图片描述
在这里插入图片描述
如下,order by中完全按照索引列的顺序来创建,所以不会出现文件排序。
在这里插入图片描述
比较特殊的情况,顺序要么是同升,要么是同降。
在这里插入图片描述
如果创建索引时,使用的是覆盖索引,如果查询出来的列不再索引中,同样会出现文件排序:
表结构

CREATE TABLE `company` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `company_name` varchar(255) DEFAULT NULL,
  `create_id` int(11) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_create_id_create_time` (`create_id`,`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

在这里插入图片描述
如图中,company_name没有添加到索引中,查询语句中如果包含索引列,同样会出现文件排序。
ORDER By 满足两种情况,会使用Index方式排序:
ORDER By语句使用索引最左前列
使用where子句与order by 子句条件列组合满足索引最左前列。
如果不在索引列上,filesort有两种算法:
双路排序:从磁盘取排序字段,在buffer中进行排序,再从磁盘取其他字段。
单路排序:从磁盘读取查询需要的所有列,安装order by列在buffer对它们进行排序,然后扫描排序后的列表进行输出,本质就是在内存中进行了排序。
提高mysql排序参数sort_buffer_size和max_length_for_sort_data

为排序使用索引
如果where使用索引的最左前缀定义为常量,则order by 能使用索引
在这里插入图片描述
奇怪的是order by中全部包含索引列,但还是出现文件排序.
在这里插入图片描述
不能使用索引排序:
排序规则不一致:
在这里插入图片描述
不满足最左前缀原则
在这里插入图片描述

GROUP BY优化
GROUP BY 实质是先排序后分组,遵照索引建的最佳左前缀
当无法使用到索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置。
where高于having,能写在where限定的条件就不要去having限定了。

猜你喜欢

转载自blog.csdn.net/BtWangZhi/article/details/86662684