MySQL如何優化ORDER BY

2021-07-14 01:25:47 字數 1342 閱讀 7402

某些情況中,mysql可以使用乙個索引來滿足order by子句,而不需要額外的排序。

即使order by不確切匹配索引,只要where子句中的所有未使用的索引部分和所有額外的order by 列為常數,就可以使用索引。下面的查詢使用索引來解決order by部分:

某些情況中,mysql可以使用乙個索引來滿足order by子句,而不需要額外的排序。

select * from t1

order by key_part1,key_part2,... ;

select * from t1

where key_part1=constant

order by key_part2;

select * from t1

order by key_part1 desc, key_part2 desc;

select * from t1

where key_part1=1

order by key_part1 desc, key_part2 desc;

在某些情況下,mysql不能使用索引來解決order by,儘管它仍然使用索引來找到匹配where子句的行。這些情況包括:

1. 讀行匹配where子句的行,如前面所示。

2. 對於每個行,記錄構成排序關鍵字和行位置的一系列值,並且記錄查詢需要的列。

3. 根據排序關鍵字排序元組

4. 按排序的順序檢索行,但直接從排序的元組讀取需要的列,而不是再一次訪問表。

為了避免速度變慢,該優化只用於排序元組中的extra列的總大小不超過max_length_for_sort_data系統變數值的時候。

如果想要增加order by的速度,首先看是否可以讓mysql使用索引而不是額外的排序階段。如果不能,可以嘗試下面的策略:

1. 增加sort_buffer_size變數的大小。

2. 增加read_rnd_buffer_size變數的大小。

3. 更改tmpdir指向具有大量空閒空間的專用檔案系統。

預設情況下,mysql排序所有group by col1,col2,…查詢的方法如同在查詢中指定order by col1,col2,…。如果顯式包括乙個包含相同的列的order by子句,mysql可以毫不減速地對它進行優化,儘管仍然進行排序。如果查詢包括group by但你想要避免排序結果的消耗,你可以指定order by null禁止排序。例如:

insert into foo

select a, count(*) from bar group by a order by null;

mysql怎麼優化 MYSQL如何優化?

mysql如何優化?結合你的經驗 1.資料庫的設計 盡量把資料庫設計的更小的佔磁碟空間.1 盡可能使用更小的整數型別.mediumint就比int更合適 2 盡可能的定義欄位為not null,除非這個字段需要null.3 如果沒有用到變長字段的話比如varchar,那就採用固定大小的紀錄格式比如c...

MySQL 如何優化

優化總結 列名描述 type 針對單錶的訪問方法,至少要達到range級別,杜絕出現all級別 key實際上使用的索引,如果沒有選擇索引,值是null ref當使用索引列等值查詢時,與索引列進行等值匹配的物件資訊 rows 預估的需要讀取的記錄條數 extra 額外的資訊 比如設計的聯合索引是 na...

如何MySQL優化總結 mysql優化小結

目標 掌握常見的優化方法 一.如何通過慢日誌發現有問題的sql?1 查詢次數多且每次查詢占用時間長的sql 通過pt query digest分析查詢sql 2 io比較大的sql 通過pt query digest分析rows examine項 3 未命中索引的sql 通過pt query dig...