程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql中進步Order by語句查詢效力的兩個思緒剖析

mysql中進步Order by語句查詢效力的兩個思緒剖析

編輯:MySQL綜合教程

mysql中進步Order by語句查詢效力的兩個思緒剖析。本站提示廣大學習愛好者:(mysql中進步Order by語句查詢效力的兩個思緒剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql中進步Order by語句查詢效力的兩個思緒剖析正文


由於能夠須要對數據庫的記載停止從新排序。在這篇文章中,筆者就談談進步Order By語句查詢效力的兩個思緒,以供年夜家參考。

在MySQL數據庫中,Order by語句的應用頻率是比擬高的。然則盡人皆知,在應用這個語句時,常常會下降數據查詢的機能。由於能夠須要對數據庫的記載停止從新排序。在這篇文章中,筆者就談談進步Order By語句查詢效力的兩個思緒,以供年夜家參考。

 

 1、建議應用一個索引來知足Order By子句。

在前提許可的情形下,筆者建議最好應用一個索引來知足Order By子句。如斯的話,便可以免額定的排序任務。這裡筆者須要強調的一點是實時Order By子句不確實婚配索引,然則只需Where子句中一切未應用的索引部門和一切額定的 Order by子句中的列為常數,此時便可以應用索引。詳細的來講,推舉以下的查詢語句。

1、select * from ad_user where is_active='Y' order by value;

在這條查詢語句中,應用了兩個列。在Where查詢語句中,查詢表中運動的記載。此時應用的是一個常數的前提。而在Order By子句中,則依據Value列的值來停止排序。假如在表設計中,為這個字段設置一個索引。此時應用這條語句來停止查詢,則查詢成果就不須要停止額定的排序任務,從而可以進步數據的查詢效力。

這也就是說,假如Where前提語句與Order By前提語句一路應用,假如須要經由過程一個索引來進步查詢效力的話,那末就必需知足一個前提,及where前提語句中所應用的參數值是常數,而不是變量。假如應用變量的話,這個辦法就不見效了。

2、留意有些情形下不克不及夠應用索引來進步Order By語句的查詢機能。

這裡須要留意的是,其實不是任何情形下都可以或許經由過程應用索引來進步Order Byz子句的查詢效力。如對分歧的症結字應用這個語句、混雜應用ASC形式和DESC形式、用於查詢前提的症結字與Order By語句中所應用的症結字分歧、對症結字的非持續元素應用Order By子句、在統一條語句中應用分歧的Order BY 和Group BY表達式、應用的表索引的類型不克不及夠按次序來保留行等情形,就沒法經由過程應用索引來處理Order By語句的排序成績。此時就須要另想他法。如可以從新調劑表構造或許查詢語句,以知足應用這個特征的特定前提。

其實這裡就碰到一個平衡的成績。如在查詢時,Where前提語句中常常應用的是一個變量,這重要是為了進步語句的靈巧性。這個變量接收前端用戶傳遞過去的參數。此時假如用戶同時有排序的需求,依據下面引見的規矩,就沒法應用索引來進步查詢的效力。此時作為開辟人員,就須要評價,須要語句的靈巧性照樣須要查詢的機能。平日情形下,關於記載量比擬年夜的查詢,同時其查詢的格局比擬固定,如年夜容量的月報與年報,此時就會偏向於查詢語句的機能。而關於記載量比擬少的查詢,如日報表,或許應用頻率比擬高的查詢語句,此時會加倍的偏向於查詢的靈巧性。作為開辟人員,如今須要存眷的就是依據用戶現實的情形,來選擇適合的處理方法。

平日情形下,為了不應用Order By語句招致的查詢速度變慢的成績,先是須要斟酌應用索引來處理成績。假如不克不及夠經由過程索引來處理成績,那末可以經由過程緩存在必定水平來減緩。如可以增長soft_buffer_size變量的年夜小、依據現實情形調劑Read_buffer_size變量的年夜小、更改tmpdir目次將其指向具有年夜量余暇空間的公用文件體系等等。有時刻治理員可使用這個特征將負載平均散布到多個目次中去。

2、應用Explain症結字來確認能否可以經由過程索引來處理Order BY速度成績。

假如用戶沒法肯定能否可以經由過程索引來進步Order By語句的查詢效力,那末便可以憑仗Explain症結字來贊助症結員停止斷定。如可以經由過程應用explain select * from ad_user where is_active='Y' order by value(即在慣例的查詢語句後面加上一個explain症結字),用來斷定能否可使用索引來進步查詢的效力。斷定的辦法是:假如這個查詢語句中,有一個using filesort這個字段,那末就異常的負疚,沒法經由過程應用索引來進步這個語句的查詢效力。反之,沒有這個字段,則解釋可以經由過程索引來進步查詢效力。

這裡須要解釋的是,平日情形下文件排序優化不只僅可以用於記載排序症結字和行的地位,而且還會記載查詢所須要的列。如斯的話,便可以免屢次讀取行的信息。為了讓年夜家加倍明確個中的事理筆者簡略解釋一下這任務的進程。平日情形下,文件排序優化包含四 個步調。第一步讀取與Where前提語句所婚配的行信息;第二步關於每一個行、記載組成排序症結字和行地位的一系列值,而且記載查詢所須要的列;第三步依據排序症結字排序元祖;第四步按排序的次序檢索行,不外此時是直接從排序的元祖讀取所須要的列(應用的是第三個步調中的成果),而不會從新拜訪表中的數據。明顯應用文件排序優化的思緒,可以免反復拜訪表,從而進步查詢的效力。

原文鏈接:http://publish.itpub.net/a2011/0225/1160/000001160766.shtml

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved