1. 程式人生 > >order by 索引失效

order by 索引失效

為什麼只有order by 欄位出現在where條件中時,才會利用該欄位的索引而避免排序。這要說到資料庫如何取到我們需要的資料了。

一條SQL實際上可以分為三步。

1.得到資料

2.處理資料 

3.返回處理後的資料 

比如上面的這條語句select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc

第一步:根據where條件和統計資訊生成執行計劃,得到資料。 

第二步:將得到的資料排序。 

當執行處理資料(order by)時,資料庫會先檢視第一步的執行計劃,看order by 的欄位是否在執行計劃中利用了索引。如果是,則可以利用索引順序而直接取得已經排好序的資料。如果不是,則排序操作。 

第三步:返回排序後的資料。 


注:ORACLE或者DB2都有一個空間來供SORT操作使用(上面所說的記憶體排序),如ORACLE中是使用者全域性區(UGA),裡面有SORT_AREA_SIZE等引數的設定。如果當排序的資料量大時,就會出現排序溢位(硬碟排序),這時的效能就會降低很多了。

總結: 

當order by 中的欄位出現在where條件中時,才會利用索引而不排序,更準確的說,order by 中的欄位在執行計劃中利用了索引時,不用排序操作。

這個結論不僅對order by有效,對其他需要排序的操作也有效。比如group by 、union 、distinct等。

相關推薦

order by 索引失效

為什麼只有order by 欄位出現在where條件中時,才會利用該欄位的索引而避免排序。這要說到資料庫如何取到我們需要的資料了。 一條SQL實際上可以分為三步。 1.得到資料 2.處理資料  3.返回處理後的資料  比如上面的這條語句select sid from zhu

使用group by分組之後子查詢的order by排序失效的問題

需求: 1.首頁的查詢需要按照lrsj進行排序 2.每一條資料通過fchrq,chxh進行分組 原始的sql SELECT fchrq,chxh FROM (SELECT top 100 percent chxh,fchrq,lrsj FROM HCZZQD_so

mysql order by索引分析

這裡主要討論一下InnoDB B-Tree索引的使用,不提設計,只管使用。B-Tree索引主要作用於WHERE和ORDER BY子句。這裡討論的均在MySQL-Server-5.7.23測試 CREATE TABLE `friends` ( `ID` int(

oracle order by索引是否使用的情況

剛開始在網上看了很多說order by 走索引有兩個前提條件 1,ORDER BY中所有的列必須包含在相同的索引中並保持在索引中的排列順序. 2,ORDER BY中所有的列必須定義為非空. 下面是測試: 建表: create

MySQL如何利用索引優化ORDER BY排序語句

login 查詢 art mysq 實例 .html 情況 降序排序 建立索引 官網排序優化:http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html MySql創建索引時支持ASC或DESC排序。

MySQL利用索引優化ORDER BY排序語句

MySQL利用索引優化ORDER BY排序語句 MySQL索引通常是被用於提高WHERE條件的資料行匹配或者執行聯結操作時匹配其它表的資料行的搜尋速度。 MySQL也能利用索引來快速地執行ORDER BY和GROUP BY語句的排序和分組操作。 通過索引優化來實

sql子查詢 order by失效問題

一、問題描述  三表聯合查詢  按主表的時間倒敘並分頁   下面sql語句 ORDER BY失效 ,如果把 ORDER BY  放在最後 比如有20條資料 第一頁會是10 -1 第二頁是20-11  分頁不正確   查詢資料發現:在my

sql order by索引之間的關係(where條件出現欄位才有效)

ORDER BY 通常會有兩種實現方法,一個是利用有序索引自動實現,也就是說利用有序索引的有序性就不再另做排序操作了。另一個是把結果選好之後再排序。 用有序索引這種,當然是最快的,不過有一些限制條件,來看下面的測試。 測試資料:student表有兩個欄位id ,sid ,id

order by索引

ORDER BY 通常會有兩種實現方法,一個是利用有序索引自動實現,也就是說利用有序索引的有序性就不再另做排序操作了。另一個是把結果選好之後再排序。 用有序索引這種,當然是最快的,不過有一些限制條件,來看下面的測試。 測試資料:student表有兩個欄位id ,

注意使用 BTREE 複合索引各欄位的 ASC/DESC 以優化 order by 查詢效率

tbl_direct_pos_201506 表有 190 萬資料,DDL:CREATE TABLE `tbl_direct_pos_201506` ( `acq_ins_code` char(13) NOT NULL DEFAULT '' COMMENT '機構程式碼',

mysq order by 不走索引問題

mysq order by 不走索引問題 問題描述 問題分析 解決方案 1.強制索引 FORCE INDEX(key) 2.聯合索引 參考

MySQL如何利用索引優化ORDER BY排序語句

MySQL也能利用索引來快速地執行ORDER BY和GROUP BY語句的排序和分組操作。 通過索引優化來實現MySQL的ORDER BY語句優化: 1、ORDER BY的索引優化。如果一個SQL語句形如: SELECT [column1],[column2],…. FROM [TABLE] ORDER BY

MyBatis 關於order by失效

  order by作為一個常用的功能,在專案中應該經常用到。   今天在實現根據傳入排序指標引數進行排序時,遇到order by沒有生效問題。  起先SQL如下:    我用的是 (1):#運算子,Mybatis會將

mysql 聯合索引> 和 order by 不走 索引 慎用

我有一個聯合索引idx_css(createddate,storeId,site) EXPLAIN SELECT * FROM statis_domain AS a WHERE a.`createddate` > '2015-04-23' AND a.`store

order by 不走索引的思考

今天早上檢視網站,發現非常慢!進linux 用top檢視,發現mysql cpu到了100%。開始懷疑是mysql效能的問題,不會10萬條資料就卡成這樣吧?雖然我的linux是在伺服器上放了個虛擬機器,但也不至於10萬條記錄掛啊? 網上找了一大把文章,my.cnf也設定了,我虛擬機器記憶體是2G,將key_

使用倒序索引提升ORDER BY DESC效能

使用倒序索引(INDEX DESC),可以大幅提升帶有order by desc子句的SQL語句效能。 一、場景 1、表名:test_t,有一欄位名為object_id 2、總資料量:580000行,segment_size:72MB 3、Where條件(Owner=’S

MySQL order by id 也會有不走索引

我在網上找了半天一直疑問著, 不知為什麼?? 但答案找到了, 呵呵。。讓我心裡解開了 <!--> query result(1 records) count(*) 993098 下面我們 來一步一步看看下面的這條語句:explain select sql_no_cache * from

【MySQL 原理分析】之 Trace 分析 order by索引原理

一、背景 昨天早上,交流群有一位同學提出了一個問題。看下圖: 我不是大佬,而且當時我自己的想法也只是猜測,所以並沒有回覆那位同學,只是接下來自己做了一個測試驗證一下。 他只簡單了說了一句話,就是同樣的sql,一個沒加 order by 就全表掃描,一個加了 order by 就走索引了。 我們可以仔細點

MySQL實驗 內連線優化order by+limit 以及新增索引再次改進

# MySQL實驗 內連線優化order by+limit 以及新增索引再次改進 在進行[子查詢優化雙引數limit](https://www.cnblogs.com/G-Aurora/p/13254473.html)時我萌生了測試更加符合實際生產需要的`ORDER BY + LIMIT`的想法,或許我們也

【開發總結】order by 為什麼沒有走索引

1.  現象 表結構如下 CREATE TABLE `ACT_HI_INST` ( `ID` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '主鍵', `INST_ID_` varchar(64) COLLATE utf8_bin NOT NU