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