MySQL Order By 使用索引的情況

2021-06-29 05:39:16 字數 1659 閱讀 2880

最近看到有篇關於mysql order by的

文章:,裡面有好幾點可疑的。

原文:1、order by的索引優化。如果乙個sql語句形如:

select [column1],[column2],…. from [table] order by [sort];

在[sort]這個欄位上建立索引就可以實現利用索引進行order by 優化。

自己測試的結果:這個要看查詢的資料量,

(1)查詢全部資料的時候,即不使用limit的時候,會全表掃瞄,即使sort列上有索引;

(2)當查詢的資料佔總表的5%的時候,使用limit的時候,會使用sort列上的索引,type=ref;

原文:2、where + order by的索引優化,形如:

select [column1],[column2],…. from [table] where [columnx] = [value] order by [sort];

建立乙個聯合索引(columnx,sort)來實現order by 優化。

自己測試的結果:

(1)建立(columnx,sort)上的聯合索引後,不論查詢的結果佔總資料量的多少,執行計畫都會走該索引,type=ref;

注意:如果columnx對應多個值,如下面語句就無法利用索引來實現order by的優化

select [column1],[column2],…. from [table] where [columnx] in ([value1],[value2],…) order by[sort];

自己測試的結果:

(2)如果是 [columnx] in ([value1],[value2],…) 這種情況,執行計畫會走該索引,但是type=all;

using where; using filesort

原文:3、where+ 多個欄位order by

select * from [table] where uid=1 order x,y limit 0,10;

建立索引(uid,x,y)實現order by的優化,比建立(x,y,uid)索引效果要好得多。

自己測試的結果:

(1)如果建立的是(uid,x)索引,也會用到這個索引,但是是using where; using filesort

(2)如果建立的是(uid,x,y),和情況1中的一樣,也會使用這個索引,而且沒有 using filesort

(3)不是比建立(x,y,uid)索引效果好,而是根本不會走這個索引

還有很多不確定的地方,例如,兩個表做連線的時候,order by 走索引的方式?兩個幾十萬的表做inner join,加limit 和不加 limit 以及 limit 的行數的多少都會引起執行計畫的改變,以及explain的 extra列裡面的using filesort,是按照limit 完後的結果集的大小與引數 max_heap_table_size,tmp_table_size設定的大小做比較,再決定是否出現的麼?還有這個limit 的資料量 是按 總結果集的 多少比例,決定走不走 索引的?越測越糊塗了~~

希望 有對order by 有深刻理解的達人給介紹下。下面是 mysql 官網對order by的優化建議

MySQL Order By索引優化

mysql order by索引優化 mysql可以直接使用索引來滿足乙個order by 子句而無需做額外的排序。儘管 order by 不是和索引的順序準確匹配,索引還是可以被用到。在一些情況下,mysql可以直接使用索引來滿足乙個 order by 或 group by 子句而無需做額外的排序...

mysql order by 排序技巧

首先我們新建表test,如下 create table test id int 11 not null auto increment,name varchar 255 default null,primary key id engine innodb auto increment 7 default...

MySQL order by工作機制

當使用order by對查詢結果進行排序時,mysql會給每個執行緒分配一塊兒記憶體sort buffer用於排序,在使用索引的情況下,整個的排序過程如下所述 1.初始化sort buffer,確定放入結果中所需的字段 2.從索引中找到第乙個滿足條件主鍵id 3.到主鍵id索引取出整行,取所需字段的...