日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

like ,order 使用索引

發布時間:2024/4/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 like ,order 使用索引 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.itpub.net/thread-377823-1-1.html

前幾天有過討論。
我的建議就是盡量避免使用"%黃%",改為如下:
select ui."UID" ui_uid, uc.id uc_id, ui.cn
from um_userinfo ui, um_user_contact uc
where ui.cn like '黃%'
and uc.borrow_org is null
and ui."UID" = uc."UID"(+)
and ui.pafa_is_active = 'true';

當然這樣也不一定會使用索引。因為姓黃的很多。最近我也遇到基本相似的問題,類似就是查詢時使用%aaa%的問題,我的建議就是讓開發人員改程序,而讓操作人員決定是否輸入百分號。

?

=============

ORDER BY 通常會有兩種實現方法,一個是利用有序索引自動實現,也就是說利用有序索引的有序性就不再另做排序操作了。另一個是把結果選好之后再排序。

一起jquery,17jquery

用有序索引這種,當然是最快的,不過有一些限制條件,來看下面的測試。 17jquery.com

一起jquery,17jquery

測試數據:student表有兩個字段id ,sid ,id是主鍵。一共有20W條記錄,id從1到200000,sid也是從1到200000的數據。 一起jquery,17jquery

內容來自17jquery

第一種情況 : 17jquery.com

一起jquery,17jquery

order by的字段不在where條件也不在select中

一起jquery,17jquery

一起jquery,17jquery

select sid from zhuyuehua.student where sid < 50000 order by id;

一起jquery,17jquery


內容來自17jquery

內容來自17jquery

第二種情況 :

17jquery.com

內容來自17jquery

order by的字段不在where條件但在select中。 內容來自17jquery

17jquery.com

select id,sid from zhuyuehua.student where sid < 50000 order by id;

17jquery.com


一起jquery,17jquery

內容來自17jquery

第三種情況 : 17jquery.com

內容來自17jquery

order by的字段在where條件但不在select中。 一起jquery,17jquery

內容來自17jquery

select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id;

17jquery.com


一起jquery,17jquery

內容來自17jquery

內容來自17jquery

第四種情況 :

內容來自17jquery

17jquery.com

order by的字段在where條件但不在select中。倒序排列

內容來自17jquery

一起jquery,17jquery

select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc; 17jquery.com

內容來自17jquery


17jquery.com

內容來自17jquery

測試結果:

內容來自17jquery

內容來自17jquery

order by的字段不在where條件不在select中 有排序操作 17jquery.com

內容來自17jquery

order by的字段不在where條件但在select中 有排序操作 內容來自17jquery

內容來自17jquery

order by的字段在where條件但不在select中 無排序操作 17jquery.com

17jquery.com

order by的字段在where條件但不在select中(倒序) 無排序操作

17jquery.com

內容來自17jquery

結論:

17jquery.com

內容來自17jquery

當order by 字段出現在where條件中時,才會利用索引而無需排序操作。其他情況,order by不會出現排序操作。

17jquery.com

內容來自17jquery

分析: 一起jquery,17jquery

內容來自17jquery

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

17jquery.com

一條SQL實際上可以分為三步。 內容來自17jquery

1.得到數據

17jquery.com

17jquery.com

2.處理數據 內容來自17jquery

一起jquery,17jquery

3.返回處理后的數據

一起jquery,17jquery

17jquery.com

比如上面的這條語句select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc 內容來自17jquery

第一步:根據where條件和統計信息生成執行計劃,得到數據。

內容來自17jquery

內容來自17jquery

第二步:將得到的數據排序。

17jquery.com

內容來自17jquery

當執行處理數據(order by)時,數據庫會先查看第一步的執行計劃,看order by 的字段是否在執行計劃中利用了索引。如果是,則可以利用索引順序而直接取得已經排好序的數據。如果不是,則排序操作。 內容來自17jquery

內容來自17jquery

第三步:返回排序后的數據。 一起jquery,17jquery

17jquery.com

另外:

內容來自17jquery

一起jquery,17jquery

上面的5萬的數據sort只用了25ms,也許大家覺得sort不怎么占用資源。可是,由于上面的表的數據是有序的,所以排序花費的時間較少。如果是個比較無序的表,sort時間就會增加很多了。另外排序操作一般都是在內存里進行的,對于數據庫來說是一種CPU的消耗,由于現在CPU的性能增強,對于普通的幾十條或上百條記錄排序對系統的影響也不會很大。但是當你的記錄集增加到上百萬條以上時,你需要注意是否一定要這么做了,大記錄集排序不僅增加了 CPU開銷,而且可能會由于內存不足發生硬盤排序的現象,當發生硬盤排序時性能會急劇下降。

17jquery.com

內容來自17jquery

注:ORACLE或者DB2都有一個空間來供SORT操作使用(上面所說的內存排序),如ORACLE中是用戶全局區(UGA),里面有SORT_AREA_SIZE等參數的設置。如果當排序的數據量大時,就會出現排序溢出(硬盤排序),這時的性能就會降低很多了。

17jquery.com

內容來自17jquery

總結: 一起jquery,17jquery

一起jquery,17jquery

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

17jquery.com

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

?

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的like ,order 使用索引的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。