Mysql中order by语句应该如何优化?

提问者:帅平 问题分类:面试刷题
Mysql中order by语句应该如何优化?
2 个回答
到头来只是玩笑一场
到头来只是玩笑一场
order by 的基本原理其实就是 MySQL 会给每个线程分配一块内存也就是 sort_buffer 用于排序,sort_buffer 中存储的是 select 涉及到的所有的字段,可以称为全字段排序吧。排序这个动作,可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和 sort_buffer 的大小,由参数 sort_buffer_size 决定。如果要排序的数据量小于 sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,就需要利用磁盘临时文件来辅助排序。
所以只存放排序相关的字段,而不是 select 涉及的所有字段,这样 sort_buffer 中存放的东西就多一点,就尽可能避免使用磁盘进行外部排序,或者说使得划分的磁盘文件相对变少,减少磁盘访问。这种排序称为 rowid 排序。如果表中单行的长度超过 max_length_for_sort_data 定义的值,那 MySQL 就认为单行太大(那么数据量肯定就越大,sort_buffer 可能不够用),由全字段排序改为 rowid 排序。
发布于:3个月前 (04-15) IP属地:四川省
自愈
自愈
1、以 select a, b, c from table where a = xxxx order by b 为例,我们为查询条件 a 和排序条件 b 建立联合索引,联合索引就是 a 是从小到大绝对有序的,如果 a 相同,再按 b 从小到大排序,这样就不需要排序了,直接避免了排序这个操作。
2、还可以进一步优化,由于联合索引 (a, b) 中没有 c 的值,所以从联合索引树上获取符合条件的对应主键 id 后,还需要回表查询取出 a b c 的值,这个回表查询的过程可以通过建立 (a,b,c) 覆盖索引来避免。
发布于:3个月前 (04-15) IP属地:四川省
我来回答