「orderby」是怎麼工作的

2021-10-14 10:25:35 字數 2548 閱讀 4603

假設你要查詢城市是「杭州」的所有人名字,並且按照姓名排序返回前1000個人的姓名、年齡。

假設這個表的部分定義是這樣的:

`

create

table

`t`(

`id`

int(11)

notnull

,`city`

varchar(16

)not

null

,`name`

varchar(16

)not

null

,`age`

int(11)

notnull

,`addr`

varchar

(128

)default

null

,primary

key(

`id`),

key`city`

(`city`))

engine

=innodb

;`

這時,你的sql語句可以這麼寫:

`

select city,name,age from t where city=

'杭州'

order

by name limit

1000

;`

那麼它的具體流程是怎麼樣的?以下將介紹order by的具體流程

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

初始化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)中排序後將資料返回給使用者。但是如果需要的資料單行欄位過大,在增大記憶體損耗的同時又減低了排序

那麼,如果mysql認為排序的單行長度太大會怎麼做呢?

將max_length_for_sort_data設定為16後,流程如下所示:

初始化sort_buffer,確定放入兩個字段,即name和id;

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

到主鍵id索引取出整行,取name、id這兩個字段,存入sort_buffer中;

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

重複步驟3、4直到不滿足city='杭州』條件為止,也就是圖中的id_y;

對sort_buffer中的資料按照欄位name進行排序;

遍歷排序結果,取前1000行,並按照id的值回到原表中取出city、name和age三個字段返回給客戶端。

我們暫且把這個排序過程,稱為roeid排序,執行流程的示意圖如下所示:

總的來說就一句話:從儲存引擎層,獲取滿足條件的資料後,將資料放在記憶體中進行排序後,根據主鍵查詢所需要的資料,返回給使用者。

mysql的核心思想:如果記憶體夠,就要多利用記憶體,儘量減少磁碟訪問

rowid對比對全欄位排序流程圖你會發現,rowid排序多訪問了一次表t的主鍵索引。

當記憶體足夠時,mysql優先使用全欄位排序。

優化:正常是取出來的資料進行排序後,將資料返回給使用者,又沒有辦法使取出來的資料就是有序的?

方法一:使用索引(city,name),這個需要回表操作

方法二:使用索引(city, name, age),覆蓋式索引直接返回資料給使用者

需要掌握如下:

明白orderby的工作機制(全欄位排序)

如何建立索引

面試題:

8.乙個訂單表有三種查詢(1)按日期查詢訂單(2)按使用者查詢訂單(3)查詢使用者一段時間內的訂單sql怎麼寫?怎麼建索引?答曰: id-date; date

9.追問:那date-id; id可不可以?為什麼?哪個好?

解答:暴力解——又(1)(2)(3)建立3個索引:date,id,date-id/id-date

在暴力法下優化——date,id-date(最左原則)

再優化——id,date-id(時間序列式遞增的,更好維護)

16 「order by」是怎麼工作的?

示例語句 select city,name,age from t where city 杭州 order by name limit 1000 mysql會給每個執行緒分配一塊記憶體用於排序,稱為sort buffer。city索引示意圖 通常情況這個語句的執行流程如下所示 初始化sort buff...

mysql的orderby是如何工作的

1.建表語句 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 k...

heartbeat是怎麼工作的

因為我們要提供 高可用性 所以要考慮到 導演 突然罷工的情形 因此我們要安排兩個導演,也 就是要有兩個排程伺服器節點。這兩個節點的地位不同,其中乙個是主節點,另外乙個是輔節點 可以看成是乙個 主導演 和乙個 副導演 這兩個節點正是 用heartbeat來互相監測對方的。heartbeat可以通過乙太...