mysql排序工作原理

mysql排序主要针对order by指令,本篇主要介绍mysql是如何进行排序以及性能优化的。我们从全字段排序和rowid排序两种排序方式介绍,当然这两种排序都基于基本的排序算法,归并排序。归并排序主要应用于大文件排序,内存有限的情况下,先将文件分为多个有序的小文件,然后将小文件进行排序,时间复杂度nlogn,当然文件的存储形式还有io的时间消耗,这也是数据库性能优化的主要目标,尽量减少磁盘io。

1
2
3
4
5
CREATE TABLE `words` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`word` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2800001 DEFAULT CHARSET=utf8;

全字段排序 vs rowId排序

顾名思义,全字段排序的意思是将记录的所有行都放到内存中进行排序,排序成功之后取固定的字段或者数量返回给客户端。mysql将所有的排序记录都优先考虑放在内存中,我们通过查询指令可以查到配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
-- sql query
use souche_study;
show variables like "%sort%"

-- result
innodb_disable_sort_file_cache OFF
innodb_ft_sort_pll_degree 2
innodb_sort_buffer_size 1048576//innodb默认的排序大小
max_length_for_sort_data 1024
max_sort_length 1024
myisam_max_sort_file_size 9223372036853727232
myisam_sort_buffer_size 8388608
sort_buffer_size 262144 //默认的排序内存大小

排序的过程如下:

cmd-markdown-logo

analyze table 命令

检测和重组表的关键字分布情况。用来分析和存储表的关键字的分布,使得系统获得准确的统计信息。在执行查询计划的时候可能会错误估计要扫描的条数,导致应用不到索引,通过analyze table命令可以使估计值更加准确。

1
analyze table table_name;//analyze+表名