真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL中排序的原理是什么

MySQL中排序的原理是什么,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

公司主營業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出沿河免費(fèi)做網(wǎng)站回饋大家。

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

比如我們使用如下 DDL 創(chuàng)建表:

CREATE TABLE `user_info` (  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',  `city` varchar(16) NOT NULL COMMENT '城市',  `name` varchar(16) NOT NULL COMMENT '姓名',  `age` int(11) NOT NULL COMMENT '年齡',  `addr` varchar(128) DEFAULT NULL COMMENT '地址',  PRIMARY KEY (`id`),  KEY `city` (`city`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

并且我們會執(zhí)行如下查詢語句

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

全字段排序

因?yàn)樯厦娴慕ū碚Z句已經(jīng)在 city 字段上面創(chuàng)建索引了,當(dāng)我們使用 EXPLAIN 命令時,會有如下結(jié)果:

MySQL中排序的原理是什么

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

MySQL中排序的原理是什么

執(zhí)行流程如下:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 初始化 sort_buffer,確定放入 city name age 這 3 個字段;

  3. 從 city 索引中獲取到***個 city='上海' 的記錄,也就是 id_x;

  4. 到主鍵索引中獲取對應(yīng)的記錄,并取出 name city age 的值放入 sort_buffer;

  5. 取下一條符合條件的記錄,重復(fù) 3 4 的操作,直至不符合條件為止;

  6. 對 sort_buffer 中的數(shù)據(jù)按照 name 做快速排序;

  7. 取出前 1000 條數(shù)據(jù)并返回。

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

MySQL中排序的原理是什么

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

rowid 排序

上面的算法在數(shù)據(jù)量比較大的時候,可能會出現(xiàn)一些問題。因?yàn)樵谂判虻臅r候,存放了所有的返回字段,增加了 排序空間 (sort_buffer)的壓力。

SET max_length_for_sort_data=16;

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

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 初始化 sort_buffer,確定放入 name id 這 2 個字段;

  3. 從 city 索引中獲取到***個 city='上海' 的記錄,也就是 id_x;

  4. 到主鍵索引中獲取對應(yīng)的記錄,并取出 name id 的值放入 sort_buffer;

  5. 取下一條符合條件的記錄,重復(fù) 3 4 的操作,直至不符合條件為止;

  6. 對 sort_buffer 中的數(shù)據(jù)按照 name 做快速排序;

  7. 取出前 1000 條數(shù)據(jù),然后根據(jù) id 取出對應(yīng)記錄的 name city age 3 個字段并返回結(jié)果。

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

MySQL中排序的原理是什么

全字段排序 VS rowid 排序

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

上面的場景是:city 字段過濾后,name 字段不是有序的。其實(shí)我們可以通過聯(lián)合索引來規(guī)避掉 name 字段的排序。

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

下面我們看一下聯(lián)合索引的示意圖:

MySQL中排序的原理是什么

從上面流程圖可以看出,當(dāng)我們?nèi)〕?city='上海' 的記錄時,name的字段也是有序的。過程如下

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 從 (city, name)索引中獲取到***個 city='上海' 的記錄 id_x;

  3. 到主鍵索引中獲取對應(yīng)的記錄,并取出 name city age 的值作為結(jié)果集的一部分直接返回;

  4. 取下一條符合條件的記錄,重復(fù) 2 3 的操作,直至不符合條件或者達(dá)到 1000 條為止;

MySQL中排序的原理是什么

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

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

當(dāng)執(zhí)行查詢語句時,不僅 name 中的字段是有序的,并且 索引中已經(jīng)包含了結(jié)果集中的所有字段,過程如下:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 從 (city, name,age)索引中獲取到***個 city='上海' 的記錄,并取出 name city age 的值作為結(jié)果集的一部分直接返回;

  3. 取下一條符合條件的記錄,重復(fù) 1 2 的操作,直至不符合條件或者達(dá)到 1000 條為止;

MySQL中排序的原理是什么

關(guān)于MySQL中排序的原理是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。


文章標(biāo)題:MySQL中排序的原理是什么
新聞來源:http://weahome.cn/article/ijdopd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部