激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL簡單了解“order by”是怎么工作的

MySQL簡單了解“order by”是怎么工作的

2020-09-25 18:24piperck Mysql

在MySQl中ORDER BY 語句用于對結果集進行排序,那么它是怎么工作的,以及如何優化,下面由小編跟大家講一講

針對排序來說,order by 是我們使用非常頻繁的關鍵字。結合之前我們對索引的了解再來看這篇文章會讓我們深刻理解在排序的時候,是如何利用索引來達到少掃描表或者使用外部排序的。

先定義一個表輔助我們后面理解:

?
1
2
3
4
5
6
7
8
9
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 ;

根據上面的表定義來看,city=xxx 可以使用到我們定義的一個索引。但是 order by name 明顯我們沒有索引,所以肯定需要先用索引查詢到 city=xxx 然后再進行回表查詢,最后再排序。

全字段排序

在 city 字段上面創建索引之后,我們使用執行計劃來查看這個語句

MySQL簡單了解“order by”是怎么工作的

可以看到有索引的情況下 我們這里還是使用了 "Using filesort" 表示需要排序,MySQL 會給每個線程分配一塊內存用于排序 稱為 sort_buffer。

我們在執行上面 select 語句的時候通常經歷了這樣一個過程

1. 初始化 sort_buffer, 確認放入 name, city, age 這三個字段。

2. 從索引 city 找到第一個滿足 city='杭州'條件的主鍵 id。

3. 回表取到 name, city, age 三個字段值,存入 sort_buffer 中。

4. 從索引 city 取下一個主鍵 id 記錄。

5. 重復 3-4 步驟,直到 city 不滿足條件。

6. 對 sort_buffer 中的數據按照字段 name 做快速排序。

7. 排序結果取前 1000 行返回給客戶端。

這被我們稱為全字段排序。

MySQL簡單了解“order by”是怎么工作的

按照 name 排序這個動作即可能在內存中完成,也可以能使用外部文件排序。這取決于 sort_buffer_size 。sort_buffer_size 的默認值是1048576 byte 也就是 1M,如果要排序的數據量小于 1m 排序就在內存中完成,如果排序數據量大,內存放不下,則使用磁盤臨時文件輔助排序。

Rowid 排序

如果單行很大,需要的字段全部放進 sort_buffer 效果就不會很好。

MySQL 中專門用于控制排序的行數據長度有個參數 max_length_for_sort_data 默認是1024,如果超過了這個值就會使用 rowid 排序。那么執行上面語句的流程就變成了

1. 初始化 sort_buffe 確定放入兩個字段即 name 和 id 。

2. 從索引 city 找到第一個滿足 city = '杭州'條件的主鍵 id。

3. 回表取 name 和 id 兩個字段 存入 sort_buffer 中。

4. 取下個滿足條件的記錄 重復 2 3 步驟。

5. 對 sort_buffer 中的 name 進行排序。

6.遍歷結果取前 1000 行。然后按照 id 再回一次表取的結果字段返回給客戶端。

MySQL簡單了解“order by”是怎么工作的

其實并不是所有 oder by 語句都需要進行上面的二次排序操作。從上面分析的執行過程,我們可以注意到。MySQL 之所以需要生成臨時表,是因為要在臨時表上做排序,是因為之前我們取得的是數據是無序的。

如果我們對剛才的索引修改一下,使得他是一個聯合索引,那么第二個字段我們拿到的值其實就是有序的了。

聯合索引滿足這么一個條件,當我們的第一個索引字段是相等的情況下,第二個字段是有序的。

這能保證如果我們建立 (city,name) 索引的話,當我們在搜索 city='杭州'的情況的是時候找到的目標第二個字段 name 其實是有序的。所以查詢過程可以簡化成。

1. 從索引 (city, name) 找到第一個滿足 city = '杭州'條件的主鍵 id 。

2. 回表取到 name city age 三個值返回。

3. 取下一個 id 。

4. 重復2 3 兩個步驟直到 1000 條記錄,或者是不滿足 city = '杭州'條件結束。

也因為查詢過程都可以使用到索引的有序性,所以不再需要排序也不需要時使用 sort buffer 了。

更近一步的優化就是之前說過的索引覆蓋,將需要查詢的字段也覆蓋進索引中,再省掉回表的步驟,可以讓整個查詢的速度更快。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/piperck/p/10796186.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 青久草视频 | 成人在线免费看 | 国产精选电影免费在线观看网站 | 精国产品一区二区三区 | 亚洲成人免费视频在线 | 91成人影库 | 国av在线 | 欧美日韩一区二区综合 | 国产色片在线观看 | 久久久久久久久成人 | 黄在线| 久草导航| 极品销魂一区二区三区 | wankzhd| 激情免费视频 | 69性欧美高清影院 | 羞羞视频免费视频欧美 | 久草在线免费资源站 | 美女毛片儿 | 亚洲一区成人在线观看 | 国产美女爽到喷白浆的 | 成人免费看片a | 国产精品刺激对白麻豆99 | 精品亚洲福利一区二区 | 国产精品白嫩白嫩大学美女 | 日韩欧美激情视频 | 爱唯侦察 国产合集 亚洲 | 精品久久久久久久久亚洲 | 色日本视频| 亚州欧美在线 | 欧美一级黄视频 | 成人性视频免费网站下载软件 | 国产一国产一级毛片视频在线 | 欧美三级欧美成人高清www | 久久久久亚洲国产精品 | 伊人久久电影网 | 免费一级特黄欧美大片勹久久网 | av人人| h视频在线免费观看 | 久久精品久久久久 | 欧美毛片|