定义表:算法
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`city` varchar(16) NOT NULL,
`name` varchar(16) NOT NULL,
`age` int(11) NOT NULL,
`addr` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `city` (`city`)
) ENGINE=InnoDB;
待查询的sql语句:
select city,name,age from t where city='杭州' order by name limit 1000 ;
复制代码
sort_buffer_size定义:
MySQL为排序开辟的内存(sort_buffer)的大小。若是要排序的数据量小于sort_buffer_size,排序就在内存中完成。但若是排序数据量太大,内存放不下,则不得不利用磁盘临时文件辅助排序sql
经过查看 OPTIMIZER_TRACE,number_of_tmp_files表示排序使用的临时文件数,外部排序通常使用归并排序算法。MySQL 将须要排序的数据分红 12 份,每一份单独排序后存在这些临时文件中。而后把这 12个有序文件再合并成一个有序的大文件bash
执行过程:ui
该过程称为全字段排序spa
若是查询返回字段不少的,MySQL会将须要排序的列和主键放入sort_buffer,此时执行流程为:code
这个过程称为rowid排序,相比较全字段排序,它只取了排序字段和主键再内存中进行排序,排序结束后还须要遍历主键索引树,取出须要查询的值,这个回表的过程比较耗时。cdn
注:blog
若是order by后面的字段走联合索引,联合索引中的数据有顺序的,好比(city, name, age)三个字段组成联合索引,会按照city排序,再按照name排序,最后按照age排序,这样查询的出的结果集能够直接返回,不须要使用sort_buffer内存进行排序,能够使用explain查看extra属性是否有Using filesort。排序