-
在实际的开发中一定会碰到根据某个字段进行排序后来显示结果的需求,但是你真的理解order by在 Mysql 底层是如何执行的吗?
-
假设你要查询城市是苏州的所有人名字,并且按照姓名进行排序返回前 1000 个人的姓名、年龄,这条 sql 语句应该如何写?
-
首先创建一张用户表,sql 语句如下:
CREATE TABLE user (
id int(11) NOT NULL,
city varchar(16) NOT NULL,
name varchar(16) NOT NULL,
age int(11) NOT NULL,
PRIMARY KEY (id),
KEY city (city)
) ENGINE=InnoDB;
则上述需求的 sql 查询语句如下:
select city,name,age from user where city='苏州' order by name limit 1000;
这条 sql 查询语句相信大家都能写出来,但是你了解它在 Mysql 底层的执行流程吗?今天陈某来大家聊一聊这条 sql 语句是如何执行的以及有什么参数会影响执行的流程。
-
本篇文章分为如下几个部分进行详细的阐述:
-
全字段排序
-
rowid 排序
-
全字段排序
-
VS rowid 排序
-
如何避免排序
全字段排序
-
前面聊过索引能够避免全表扫描,因此我们给city这个字段上添加了索引,当然城市的字段很小,不用考虑字符串的索引问题,之前有写过一篇关于如何给字符串的加索引的文章,有不了解朋友看一下这篇文章:Mysql 性能优化:如何给字符串加索引?
-
此时用Explain来分析一下的这条查询语句的执行情况,结果如下图:
-
Extra这个字段中的Using filesort表示的就是需要排序,MySQL 会给每个线程分配一块内存用于排序,称为sort_buffer。
-
既然使用了索引进行查询,我们来简单的画一下city这棵索引树的结构,如下图: