<返回更多

天天写order by,你知道Mysql底层执行原理吗?

2020-04-15    
加入收藏

前言

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;
select city,name,age from user where city='苏州' order by name limit 1000;

全字段排序

天天写order by,你知道Mysql底层执行原理吗?

 

天天写order by,你知道Mysql底层执行原理吗?

 

 

1.  初始化 sort_buffer,确定放入 name、city、age 这三个字段。
2.  从索引 city 找到第一个满足`city='苏州'`条件的`主键id`,也就是图中的`ID3`。
3.  到`主键id索引`取出整行,取`name`、`city`、`age`三个字段的值,存入`sort_buffer`中。
4.  从索引`city`取下一个记录的主键 id。
5.  重复步骤 3、4 直到 city 的值不满足查询条件为止,对应的主键 id 也就是图中的`IDX`。
6.  对`sort_buffer`中的数据按照字段`name`做快速排序。
7.  按照排序结果取前 1000 行返回给客户端。

rowid 排序

SET max_length_for_sort_data = 16;
天天写order by,你知道Mysql底层执行原理吗?

 

全字段排序 VS rowid 排序

如何避免排序

alter table user add index city_user(city, name);
天天写order by,你知道Mysql底层执行原理吗?

 

 

1. 从索引(city,name)找到第一个满足 city='苏州’条件的主键 id。2. 到主键 id 索引取出整行,取 name、city、age 三个字段的值,作为结果集的一部分直接返回。3. 从索引(city,name)取下一个记录主键 id。4. 重复步骤 2、3,直到查到第 1000 条记录,或者是不满足 city='苏州'条件时循环结束。

天天写order by,你知道Mysql底层执行原理吗?

 

alter table user add index city_user_age(city, name, age);

总结

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>