<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-09 21:14:24
        文檔

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

        MySQL簡單了解orderby是怎么工作的:針對排序來說,order by 是我們使用非常頻繁的關鍵字。結合之前我們對索引的了解再來看這篇文章會讓我們深刻理解在排序的時候,是如何利用索引來達到少掃描表或者使用外部排序的。 先定義一個表輔助我們后面理解: CREATE TABLE `t` ( `id` in
        推薦度:
        導讀MySQL簡單了解orderby是怎么工作的:針對排序來說,order by 是我們使用非常頻繁的關鍵字。結合之前我們對索引的了解再來看這篇文章會讓我們深刻理解在排序的時候,是如何利用索引來達到少掃描表或者使用外部排序的。 先定義一個表輔助我們后面理解: CREATE TABLE `t` ( `id` in

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

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

        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 字段上面創建索引之后,我們使用執行計劃來查看這個語句

        可以看到有索引的情況下 我們這里還是使用了 "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 行返回給客戶端。

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

        按照 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 再回一次表取的結果字段返回給客戶端。

        其實并不是所有 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 了。

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

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        MySQL簡單了解orderby是怎么工作的:針對排序來說,order by 是我們使用非常頻繁的關鍵字。結合之前我們對索引的了解再來看這篇文章會讓我們深刻理解在排序的時候,是如何利用索引來達到少掃描表或者使用外部排序的。 先定義一個表輔助我們后面理解: CREATE TABLE `t` ( `id` in
        推薦度:
        標簽: 簡單 是如何 了解
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 手机永久免费的AV在线电影网| 亚洲sss综合天堂久久久| 男女啪啪免费体验区| 免费欧洲美女牲交视频| 色噜噜噜噜亚洲第一| 免费国产美女爽到喷出水来视频| 亚洲av无码成人精品区一本二本 | 亚洲成人高清在线观看| 91精品导航在线网址免费| 亚洲成人在线免费观看| 97人伦色伦成人免费视频| 亚洲国产成人久久综合| 亚洲?V乱码久久精品蜜桃| 国产性生大片免费观看性 | 色吊丝永久在线观看最新免费| 亚洲高清一区二区三区电影| 国产伦一区二区三区免费| 一级毛片aaaaaa视频免费看| 亚洲国产精品成人精品无码区| 99精品视频免费观看| 亚洲成人免费网址| 精品国产免费观看| 两个人看的www免费高清| 久久精品国产亚洲AV高清热| 免费看国产精品3a黄的视频| 国产亚洲蜜芽精品久久| 国产偷国产偷亚洲清高动态图| 91精品免费观看| 亚洲AV成人无码久久WWW| 亚洲伊人色欲综合网| 成人免费大片免费观看网站| 亚洲AV成人精品一区二区三区| 亚洲一级特黄无码片| 国产人成免费视频网站| 亚洲Av永久无码精品黑人| 亚洲色婷婷一区二区三区| 丁香花免费高清视频完整版| 暖暖免费中文在线日本| 亚洲大片免费观看| 中文字幕日韩亚洲| 99久久综合国产精品免费|