16OrderBy

算法流程

  • 全字段排序
  • rowid排序
1
2
3
4
5
6
7
8
9
10
11
12
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;


select city,name,age from t where city='杭州' order by name limit 1000 ;

全字段排序

全字段排序,在内存进行,目的是减少IO

根据city索引找到记录,逐行回表取到city,name,age放入内存排序取前1000,返回结果

当内存不足以存储所有数据时需用外存,若字段太多,内存可同时放入的行数少,分成的临时文件太多,排序性能差。

sort_buffer_size 参数控制用于排序的内存大小
number_of_tmp_files 表示排序过程中使用的临时文件数,外部排序一般使用归并排序算法

rowid排序

根据city索引找到记录,逐行回表将name和id放入内存,排序后取前1000id,再回表取得完整数据,返回结果;

优化:建立联合索引(city,name,age) 索引中已排好序。

问题

深分页

1
2
select * from  customers c inner join (select id from customers order by CustomerName LIMIT 2000000,100) as tmp
on c.id=tmp.id