mysql 高階知識 order by 排序優化

2021-10-11 17:42:35 字數 1890 閱讀 5386

order by 總結

在開發時,我們經常要使用 order by 進行資料排序,經常會出現 useing filesort,導致 mysql 效能會急劇下降,因此我們要非常重視 order by。

filesort 排序 和 index

order by 語句使用索引最左前列。

where 語句 和 order by 語句 組合起來滿足了索引左前列

使用到了索引最左前列並且排序字段排序方式相同

案例說明

表結構:

create table test(

id int primary key auto_increment,

c1 varchar(10),

c2 varchar(10),

c3 varchar(10),

c4 varchar(10),

c5 varchar(10)

) engine=innodb default charset=utf8;

索引:create index idx_t1t2 on test(c1,c2,c3,c4)

未使用最左前列索引排序

explain

select

*from test where c1>

'a1'

order

by c2

//方案一:補全索引最左前列

explain

select c1 from test where c1>

'a1'

order

by c1,c2

//方案二:where 語句 和 order by 語句 組合滿足最左前列索引

explain

select c1 from test where c1=

'a1'

order

by c2

排序方式不同

explain

select c1 from test where c1>

'a1'

order

by c1 asc

,c2 desc

//方案一:將 c1 設定為常量。這個可能有點繞,其實原理很簡單。

//如果 c1 字段條件為常量,那麼表示 c1 欄位的結果都是同乙個值,c1就不用排序。

//所以變相的等於 c1 字段 和 c2 欄位是同乙個排序型別。

explain

select c1 from test where c1=

'a1'

order

by c1 asc

,c2 desc

//方案二:將兩個排序順序調整為一致

//全部調整為公升序

explain

select c1 from test where c1>

'a1'

order

by c1 asc

,c2 asc

//全部調整為降序

explain

select c1 from test where c1>

'a1'

order

by c1 desc

,c2 desc

因為 mysql 4.1 後使用了單路排序,在讀取到資料後會把資料儲存在記憶體中。當讀取資料超過了 sort_buffer 的容量時,就會導致多次讀取資料,並建立臨時表,產生多次 i/o,反而增加了 i/o 運算。

感謝

mysql高階知識(八)——order by優化

mysql 高階 mysql高階知識

一.儲存引擎 引擎 指的是乙個系統的核心部分 引擎有不同分類是為了適應不同的使用場景 檢視mysql支援所有引擎 show engines mrg myisam 是一堆myisam表的集合 用於做水平分表,如果乙個表中資料量太大 將導致效率降低 水平分表就是把整個大表拆成不同的小表,每一次查詢 會判...

mysql知識 MySQL高階知識(一) 基礎

1.關於mysql的一些檔案 mysql如何安裝 如何配置自啟動,這裡不進行講述,可自行搜尋相關安裝教程進行處理。這裡主要介紹mysql的主要配置檔案。二進位制日誌log bin 用於主從複製。錯誤日誌log error 預設關閉,記錄嚴重的警告和錯誤資訊,每次啟動和關閉的詳細資訊等。查詢日誌sho...

MySQL高階知識(三) 索引

mysql官方對索引的定義 索引 index 是幫助mysql高效獲取資料的資料結構。因此索引的本質就是資料結構。索引的目的在於提高查詢效率,可模擬字典 書籍的目錄等這種形式。可簡單理解為 排好序的快速查詢資料結構 在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式指...