order by关键字优化

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;

在这里插入图片描述
产生了filesort(带头大哥不能死,中间兄弟不能断)

EXPLAIN SELECT * FROM tblA WHERE age>20 ORDER BY birth,age;

order by关键字优化_第1张图片
产生了filesort,应避免

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活动和低的处理器使用率.

你可能感兴趣的:(order by关键字优化)