MySQL學習(二十五)order by 邏輯

2022-01-12 14:15:53 字數 1642 閱讀 9041

文章來自《mysql 45講》非原創

本文將會介紹 order by 排序中的兩種情況

什麼意思呢?全欄位排序講的是整行拿到 sort buffer 中進行排序,然後返回正確的結果給客戶端,而 rowid 排序只是取一行中部分欄位到 sort buffer 中進行排序,而是否使用到了臨時檔案則是sort buffer 不夠(也有可能需要排序的行數過多,總的來說就是需要排序的行數相對於sort buffer 太大了)這時就會使用到臨時檔案,使用到臨時檔案肯定相對於使用記憶體速度會慢,假如出現這種情況可以優化 sql 語句對查詢進行優化。

例子來自 《mysql 45講》非原創 加入我們存在以下表 :

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  ;
然後我們使用explain檢視一下這條語句的執行邏輯。

extra這個欄位中的「using filesort」表示的就是需要排序,mysql會給每個執行緒分配一塊記憶體用於排序,稱為sort_buffer。

為了說明這個sql查詢語句的執行過程,我們先來看一下city這個索引的示意圖。

通常情況下,這個語句執行流程如下所示 :

初始化sort_buffer,確定放入name、city、age這三個字段;

從索引city找到第乙個滿足city='杭州』條件的主鍵id,也就是圖中的id_x;

到主鍵id索引取出整行,取name、city、age三個欄位的值,存入sort_buffer中;

從索引city取下乙個記錄的主鍵id;

重複步驟3、4直到city的值不滿足查詢條件為止,對應的主鍵id也就是圖中的id_y;

對sort_buffer中的資料按照欄位name做快速排序;

按照排序結果取前1000行返回給客戶端。

在全欄位排序中,我們是取整一行資料放在 sort buffer 中進行排序,而 rowid 排序則是取部分字段,然後排好後,再回表找到想要返回的字段,回表的操作必定比不回表的操作慢,假如需要我們優化查詢語句可以使用覆蓋索引進行優化查詢語句

演算法(二十五)

1 給定兩個不字串,求出最長公共子串行的長度。int longestpublicsubsequence string x,string y else return math.max longestpublicsubsequence x.substring 1 y.substring 0 longes...

Effective C 之二十五

要點 提供不會丟擲異常的swap函式。swap自stl引入後就成為異常安全 exception safe 程式設計的基石。在條款11避免自賦值時已談到過。stl中swap的預設實現是通過臨時變數實現交換。但是對某些型別這是很低效的,例如pimpl只需要交換指標即可。之後,meyers提出在std命名...

Linux基礎(二十五)

進入linux字元介面方式有字元介面 圖形介面下的終端以及虛擬控制台等方式。在字元介面下,虛擬控制台的選擇可以通過按下 alt 鍵和1個功能鍵來實現,功能鍵通常為f1 f6鍵。比如使用者登入後,按下 alt f2 鍵,使用者可以看 login 提示符,說明使用者進入了第2個虛擬控制台。然後只需利用按...