《MySQL——order by邏輯(全字段排序與rowid排序)》

創建一個表,然后使用查詢語句:
查詢城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 個人的姓名、年齡

create table 't' ('id' int(11) not null,'city' vachar(16) not null,'name' vachar(16) not null,'age' vachar(16) 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字段上加上索引

假設滿足city = '杭州’條件的行是從ID_X到ID_(X+N)的這些記錄。
執行流程:
1、初始化sort_buffer,確定放入name、city、age三個字段;
2、從索引city找到第一個滿足city = '杭州’條件的主鍵id,也就是ID_X;
3、到主鍵id索引取出整行,取name、city、age三個字段值,存入sort_buffer;
4、從索引city取下一個記錄的主鍵id;
5、重復step3、4直到city的值不滿足查詢條件為止,對應的ID(X+N);
6、對sort_buffer中的數據按照字段name做快速排序
7、按照排序結果取前1000行返回給客戶端

tip:sort_buffer是MySQL分配給每個線程用于排序的內存。
sort_buffer是MySQL分配給每個線程用于排序的內存。sort_buffer_size是sort_buffer的大小,如果要排序的數據量小于sort_buffer_size,排序就在內存中完成,如果排序數據量過大,就得使用磁盤臨時文件輔助排序。外部排序一般使用歸并排序算法。

rowid 排序

全字段排序方法缺點:單行大的話占用內存空間。
通過修改MySQL中專門控制用于排序的行數據的長度的一個參數。意思是,如果單行的長度超過這個值,就會換一種算法

SET max_length_for_sort_data = 16;

新的算法只會講排序的列(name字段)和主鍵id放入sort_buffer;
所以排序的結果就少了city和age字段值,不能直接返回。
執行流程如下:
1、初始化sort_buffer,確定放入name和id字段;
2、從city索引中找到第一個滿足city = '杭州’條件的主鍵id,也就是圖中的ID_X;
3、到主鍵id索引取出整行,取name、id兩個字段,存入sort_buffer;
4、從city索引取下一條記錄的主鍵id
5、重復step3、4直到不滿足city = '杭州’為止
6、對sort_buffer中的數據按照字段name進行排序
7、遍歷排序結果,取前1000行,并按照id的值回到原表中取出city、name、age三個字段返回給客戶端

rowid 方式和全字段方式一樣,需要先把查詢到的結果全部放在內存或硬盤中,再使用相關算法進行排序。而排序后由于沒有保存所需的字段,需要按順序使用主鍵再從索引樹上查詢,查到一個就返回一個,而不用把所有內容查完放到內存上再一并返回。

兩者比較

全字段排序
rowid 排序

如果擔心排序內存太小,會影響排序效率,才會采用rowid排序算法,這樣排序過程中依次可以排序更多行,但是需要再回到原表去取數據。
如果MySQL認為內存足夠大,會優先選擇全字段排序,把需要的字段都放到sort_buffer中,這樣排序后就會直接從內存里面返回查詢結果了,不用再回到原表中取數據。

對于InnoDB,rowid排序會要求回表多造成磁盤讀,因此不會被優先選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377229.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ruby 生成哈希值_哈希== Ruby中的運算符

ruby 生成哈希值In the last article, we have seen how we can compare two hash objects with the help of < operator? "<" method is a public instance method defined in Rubys library. 在上一篇文章中&#xff0c;我們看到了如何在<運算符的幫助下…

HTML5 video

摘要&#xff1a;本文主要介紹HTML5 video在android2.2中實現的主要架構和程序流程。 一、實現HTML5 video主要的類 1&#xff0e; 主要類結構及介紹 圖1中綠色類為java類&#xff0c;其余為c類&#xff0c;下面是各個類的具體介紹: (1) HTMLElement類不是最上層類&#xff0c…

《MySQL——使用聯合索引、覆蓋索引,避免臨時表的排序操作》

聯合索引避免臨時表排序 在上一篇筆記(MySQL——order by邏輯&#xff08;全字段排序與rowid排序&#xff09;)中&#xff0c;講到查詢語句查詢多個字段的時候使用order by語句實現返回值是有序的&#xff0c;而order by是使用到了臨時表的&#xff0c;會帶來時間和空間損失。…

明源面試

明源面試&#xff0c;筆試題目如下 一、SQL測試題 1 有兩張表 根據給出的SQL語句&#xff0c;寫出返回的行數分別是多少&#xff1f;為了形象直觀的顯示&#xff0c;我給出了sql語句執行結果。 A 學生表 B分數表 新題目 select a.* from a inner join b on a.idb.id; …

AEAP的完整形式是什么?

AEAP&#xff1a;盡早 (AEAP: As Early As Possible) AEAP is an abbreviation of "As Early As Possible". AEAP是“ April越早”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Faceboo…

jquery 視覺特效(鼠標懸停時依次顯示圖片)

效果描述&#xff1a; 有幾副圖片&#xff0c;讓他們依次疊加重合。首先顯示第一張圖片。然后鼠標懸停在上面&#xff0c;邊框變化。然后離開&#xff0c;然后第一張淡出&#xff0c;第二張淡入。接著懸停在第二張圖片&#xff0c;邊框變化&#xff0c;然后離開&#xff0c;第二…

《MySQL tips:查詢時,盡量不要對字段進行操作》

維護一個交易系統&#xff0c;交易記錄表tradelog包含交易流水號(tradeid)、交易員id(operator)、交易時間(t_modified)等字段。 建表語句如下&#xff1a; create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_mo…

cocos2dx blender 骨骼動畫實現

前言 cocos2d-x 中相關部分代碼介紹 背景知識介紹 參考 http://www.3dkingdoms.com/weekly/weekly.php?a4 一 簡單3d 模型支持 第一步實現對3d 模型的簡單支持&#xff0c;完成一個CCSprite3D 類 參考CCSprite 類 以及 CCGLProgram 代碼 主要修改 draw 方法。 添加了定點數組…

關于web.config中customErrors節點說明

關于web.config中<customErrors>節點說明 <customErrors>節點用于定義一些自定義錯誤信息的信息。此節點有Mode和defaultRedirect兩個屬性&#xff0c;其中defaultRedirect屬性是一個可選屬性&#xff0c;表示應用程序發生錯誤時重定向到的默認URL&#xff0c;如果…

肯德基收銀系統模式_肯德基的完整形式是什么?

肯德基收銀系統模式肯德基&#xff1a;肯塔基炸雞 (KFC: Kentucky Fried Chicken) KFC is an abbreviation of "Kentucky Fried Chicken". It is a fast-food restaurant chain whose specialty is known for fried chicken because of its specialization in it. It…

泛型(CSDN轉載)

函數的參數不同叫多態&#xff0c;函數的參數類型可以不確定嗎&#xff1f; 函數的返回值只能是一個嗎&#xff1f;函數的返回值可以不確定嗎&#xff1f; 泛型是一種特殊的類型&#xff0c;它把指定類型的工作推遲到客戶端代碼聲明并實例化類或方法的時候進行。 下面是兩個經典…

《MySQL tips:隱式類型轉換與隱式字符編碼轉換對查詢效率的影響》

維護一個交易系統&#xff0c;交易記錄表tradelog包含交易流水號(tradeid)、交易員id(operator)、交易時間(t_modified)等字段。 create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_modified datetime default n…

HDU4291 A Short problem

求通項和斐波那契數列的方法一樣&#xff0c;矩陣快速冪。 這道題麻煩在套了三層。 但其實取模這種操作肯定會出現循環的&#xff0c;可以先本地暴出循環節&#xff0c;1000000007對應的循環節是222222224&#xff0c;222222224對應的循環節是183120。 最外層的結果是對1000000…

pvr波形是什么意思_PVR的完整形式是什么?

pvr波形是什么意思PVR&#xff1a;Priya村路演 (PVR: Priya Village Roadshow) PVR is an abbreviation of Priya Village Roadshow. It is one of the biggest and leading multiplex cinema chains in India. PVR是Priya Village Roadshow的縮寫 。 它是印度最大和領先的多元…

《MySQL——查詢長時間不返回的三種原因與查詢慢的原因》

目錄查詢長時間不返回等MDL鎖等flush等行鎖查詢慢構造一張表&#xff0c;表有兩個字段id和c&#xff0c;再里面插入了10萬行記錄 create table t (id int(11) not null,c int(11) default null,primary key (id) ) engine InnoDB;delimiter ;; create procedure idata() begi…

Linux 命令積累 fuser lsof mtr

fuser 用途:使用文件或文件結構識別進程,即:查詢都有哪些進程占用了制定的文件、目錄、設備或套接字;lsof MTR fuser命令 用途:使用文件或文件結構識別進程,即:查詢都有哪些進程占用了制定的文件、目錄、設備或套接字;語法:fuser [-c|-d|-f] [-k] [-u] [-x] [-V] 文件/目錄…

線程終止問題

http://topic.csdn.net/u/20080429/09/9cfe5204-20b5-40fb-ac12-afdc1e4939e9.html?590511460 線程終止問題 http://blog.csdn.net/wuyazhe/article/details/1771470 帶有消息機制的線程 - CustomMessageQueue(c#) using System; using System.Collections.Generic; using Sy…

HTH的完整形式是什么?

HTH&#xff1a;希望這個(那個)有幫助 (HTH: Hope This (That) Helps) HTH is an abbreviation of "Hope This (That) Helps". HTH是“希望有幫助”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking si…

排序算法復習—希爾排序

希爾排序&#xff0c;也稱遞減增量排序算法&#xff0c;是插入排序的一種更高效的改進版本。 希爾排序將整個待排元素序列分割成若干個子序列&#xff08;由相隔某個“增量”的元素組成的&#xff09;分別進行直接插入排序&#xff0c;過程中較小的元素&#xff0c;跳躍式的往前…

《MySQL——幻讀與next-key lock與間隙鎖帶來的死鎖》

create table t (id int(11) not null,c int(11) default null,d int(11) default null,primary key (id),key c (c) ) engine InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);該表除了主鍵id&#xff0c;還有索引c。 問下面的語句…