成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL排序工作原理

數據庫 MySQL
在程序設計當中,我們很多場景下都會用 group by 關鍵字。比如在分頁讀取數據時,為了避免重復掃描記錄,這就是必須要使用 group by 了。

MySQL的 order by 工作原理

在程序設計當中,我們很多場景下都會用 group by 關鍵字。比如在分頁讀取數據時,為了避免重復掃描記錄,這就是必須要使用 group by 了。

比如我們使用如下 DDL 創建表:

  1. CREATE TABLE `user_info` ( 
  2.  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID'
  3.  `city` varchar(16) NOT NULL COMMENT '城市'
  4.  `namevarchar(16) NOT NULL COMMENT '姓名'
  5.  `age` int(11) NOT NULL COMMENT '年齡'
  6.  `addr` varchar(128) DEFAULT NULL COMMENT '地址'
  7.  PRIMARY KEY (`id`), 
  8.  KEY `city` (`city`) 
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

并且我們會執行如下查詢語句

  1. SELECT city,`name`,age FROM user_info WHERE city='上海' ORDER BY `name` LIMIT 1000; 

全字段排序

因為上面的建表語句已經在 city 字段上面創建索引了,當我們使用 EXPLAIN 命令時,會有如下結果:

MySQL的 order by 工作原理

上面 Extra 字段中的 “Using filesort” 表示的就是需要排序,MySQL 會為每個線程分配一塊內存用于排序,成為 sort_buffer。下面我們看一下 index(city) 的結構示意圖。

MySQL的 order by 工作原理

執行流程如下:

  1. 初始化 sort_buffer,確定放入 city name age 這 3 個字段;
  2. 從 city 索引中獲取到***個 city='上海' 的記錄,也就是 id_x;
  3. 到主鍵索引中獲取對應的記錄,并取出 name city age 的值放入 sort_buffer;
  4. 取下一條符合條件的記錄,重復 3 4 的操作,直至不符合條件為止;
  5. 對 sort_buffer 中的數據按照 name 做快速排序;
  6. 取出前 1000 條數據并返回。

我們暫時叫這種排序過程為“全字段排序”,如下所示:

MySQL的 order by 工作原理

圖中的“按 name 排序” 可能在內存中,也可能使用磁盤文件排序,這取決與排序所需要的內存和 sort_buffer_size 。sort_buffer_size 就是 MySQL 為排序開辟的內存大小,當所需內存小于 sort_buffer_size 時,就直接在內存中完成排序,如果所需要的內存 大于 sort_buffer_size ,就需要額外的磁盤空間輔助排序。

rowid 排序

上面的算法在數據量比較大的時候,可能會出現一些問題。因為在排序的時候,存放了所有的返回字段,增加了 排序空間 (sort_buffer)的壓力。

  1. SET max_length_for_sort_data=16; 

max_length_for_sort_data 是MySQL 限制排序行大小的參數。意思是,如果排序行大小超過了這個值,就會另選排序算法。上面 name city age 3 個字段的大小為 36,大于 16 ,在新的算法中將只有 name (排序字段) 和id 參與 sort_buffer 中的排序。過程如下

  1. 初始化 sort_buffer,確定放入 name id 這 2 個字段;
  2. 從 city 索引中獲取到***個 city='上海' 的記錄,也就是 id_x;
  3. 到主鍵索引中獲取對應的記錄,并取出 name id 的值放入 sort_buffer;
  4. 取下一條符合條件的記錄,重復 3 4 的操作,直至不符合條件為止;
  5. 對 sort_buffer 中的數據按照 name 做快速排序;
  6. 取出前 1000 條數據,然后根據 id 取出對應記錄的 name city age 3 個字段并返回結果。

這種排序過程,我們稱為 rowid 排序,過程如下所示:

MySQL的 order by 工作原理

全字段排序 VS rowid 排序

從上面 2 個流程看來,如果內存足夠時,MySQL 會讓返回值中所有字段存放在排序空間。當MySQL 內存過小時,才會考慮使用rowid 排序。但是從上面的流程看來,rowid 排序在返回結果前,還會再一次的回表。因此MySQL 認為內存充足的時候,會優先采用 全字段排序。

上面的場景是:city 字段過濾后,name 字段不是有序的。其實我們可以通過聯合索引來規避掉 name 字段的排序。

  1. alter table user_info add index idx_city_user(city, name); 

下面我們看一下聯合索引的示意圖:

MySQL的 order by 工作原理

從上面流程圖可以看出,當我們取出 city='上海' 的記錄時,name的字段也是有序的。過程如下

  1. 從 (city, name)索引中獲取到***個 city='上海' 的記錄 id_x;
  2. 到主鍵索引中獲取對應的記錄,并取出 name city age 的值作為結果集的一部分直接返回;
  3. 取下一條符合條件的記錄,重復 2 3 的操作,直至不符合條件或者達到 1000 條為止;

MySQL的 order by 工作原理

從聯合索引看來,我們是可以不用排序操作了,那么我們是否可以直接通過 索引就直接返回結果呢?也就是不要回表操作。答案是有的,那就是覆蓋索引。

  1. alter table user_info add index idx_city_user_age(city, name, age); 

當執行查詢語句時,不僅 name 中的字段是有序的,并且 索引中已經包含了結果集中的所有字段,過程如下:

  1. 從 (city, name,age)索引中獲取到***個 city='上海' 的記錄,并取出 name city age 的值作為結果集的一部分直接返回;
  2. 取下一條符合條件的記錄,重復 1 2 的操作,直至不符合條件或者達到 1000 條為止;

MySQL的 order by 工作原理

 

責任編輯:龐桂玉 來源: 今天頭條
相關推薦

2010-11-25 10:28:28

MySQL查詢優化器

2009-08-14 13:19:23

2009-06-18 13:31:03

Spring工作原理

2019-04-29 11:14:25

MySQL存儲排序

2010-09-25 13:11:48

DHCP工作原理

2021-02-05 15:01:41

GitLinux命令

2020-06-15 07:00:00

GitOpsKubernetesDevOps

2009-06-15 15:57:21

Spring工作原理

2009-07-16 10:23:30

iBATIS工作原理

2015-11-04 09:23:17

JavaServlet工作原理

2020-05-19 09:11:20

機器學習技術數據

2009-08-27 17:13:20

DHCP的工作原理

2010-05-05 16:47:57

Unix Tripwi

2010-02-04 10:43:05

Android DDM

2013-08-26 10:48:02

Reddit排名算法算法

2019-08-20 14:01:22

HTTPSSSL協議

2013-09-18 14:01:46

JavaScript

2010-09-29 09:28:04

DHCP工作原理

2011-03-25 09:34:34

Nagios網絡監控

2013-06-04 13:53:30

OSPF路由協議OSPF協議OSPF
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久亚洲综合 | 51ⅴ精品国产91久久久久久 | 亚洲国产网址 | 中文字幕在线免费视频 | 美女视频.| 中文字幕av在线播放 | 国产色播av在线 | 91视频进入 | 欧美一级片在线播放 | 国产精品成人在线 | 久久久精品国产 | 精品国产成人 | 成人av网站在线观看 | 日韩有码在线观看 | 先锋资源网| 午夜电影网 | 亚洲精品一二三区 | 欧美全黄 | 亚洲一区二区三区国产 | 91精品久久久久久久99 | 久久久久久久久久久久91 | 久久99精品国产 | 久久不卡区 | 夜夜骑天天干 | 久久免费大片 | 亚洲精品女人久久久 | 国产美女一区二区 | 精品乱码一区二区 | 欧美精品一区二区三区在线 | 国产精品明星裸体写真集 | 黄色毛片黄色毛片 | 99久久精品免费看国产小宝寻花 | 欧美无乱码久久久免费午夜一区 | 国产高清91| 国产成人精品高清久久 | 91精品一区| 欧美一区二区大片 | www国产亚洲精品久久网站 | www.狠狠操| 久久国产精品一区二区三区 | 国产精品色婷婷久久58 |