order by子句,尽量使用Index方式排序,避免使用FileSort方式排序
新建表tblA
CREATE TABLE `tblA` (
`age` int DEFAULT NULL,
`birth` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
插入字段
INSERT INTO `test`.`tblA`(`age`, `birth`) VALUES (22, '2020-06-13 09:46:53');
INSERT INTO `test`.`tblA`(`age`, `birth`) VALUES (23, '2020-06-13 09:47:04');
INSERT INTO `test`.`tblA`(`age`, `birth`) VALUES (24, '2020-06-13 09:47:12');
创建索引
CREATE INDEX idx_A_ageBirth ON tblA(age,birth);
EXPLAIN SELECT * FROM tblA WHERE age>20 ORDER BY age;
EXPLAIN SELECT * FROM tblA WHERE age>20 ORDER BY age,birth;
EXPLAIN SELECT * FROM tblA WHERE age>20 ORDER BY birth;
EXPLAIN SELECT * FROM tblA WHERE age>20 ORDER BY birth,age;
EXPLAIN SELECT * FROM tblA ORDER BY birth;
产生了filesort(带头大哥不能死,中间兄弟不能断),下面同理
EXPLAIN SELECT * FROM tblA WHERE birth>'2020-06-13 09:46:52' ORDER BY birth;
EXPLAIN SELECT * FROM tblA ORDER BY age ASC,birth DESC;
提高Order By的速度
1、Order By是select *是一个大忌只query需要的字段,这点非常重要。在这里影响是:
1.1当query的字段大小总和小于max_length_for_sort_data而且排序字段不是TEXT|BLOB类型时,会用改进后的算法–单路排序,否则用老算法–多路排序
1.2两种算法的数据都有可能超出sort_ buffer的容量, 超出之后,会创建tmp文件进行合并排序,导致多次/O,但是用单路排序算法的风险会更大一些,所以要提高sort_ buffer_ size 。
2.尝试提高sort_ buffer_ size
不管用哪种算法,提高这个参数都会提高效率,当然, 要根据系统的能力去提高,因为这个参数是针对每个进程的
3.尝试提高max_ length for_ sort_ data
提高这个参数,会增加用改进算法的概率。 但是如果设的太高,数据总容量超出sort buffer _size的概率就增大,明显症状是高
的磁盘I/O活动和低的处理器使用率.