<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        MySQL查詢優(yōu)化系列講座之查詢優(yōu)化器_MySQL

        來源:懂視網(wǎng) 責編:小采 時間:2020-11-09 17:01:11
        文檔

        MySQL查詢優(yōu)化系列講座之查詢優(yōu)化器_MySQL

        MySQL查詢優(yōu)化系列講座之查詢優(yōu)化器_MySQL:MySQL優(yōu)化MySQL查詢 當你提交一個查詢的時候,MySQL會分析它,看是否可以做一些優(yōu)化使處理該查詢的速度更快。這一部分將介紹查詢優(yōu)化器是如何工作的。如果你想知道MySQL采用的優(yōu)化手段,可以查看MySQL參考手冊。 當然,MySQL查詢優(yōu)化器也利用了索引,但
        推薦度:
        導讀MySQL查詢優(yōu)化系列講座之查詢優(yōu)化器_MySQL:MySQL優(yōu)化MySQL查詢 當你提交一個查詢的時候,MySQL會分析它,看是否可以做一些優(yōu)化使處理該查詢的速度更快。這一部分將介紹查詢優(yōu)化器是如何工作的。如果你想知道MySQL采用的優(yōu)化手段,可以查看MySQL參考手冊。 當然,MySQL查詢優(yōu)化器也利用了索引,但

        MySQL優(yōu)化MySQL查詢


          當你提交一個查詢的時候,MySQL會分析它,看是否可以做一些優(yōu)化使處理該查詢的速度更快。這一部分將介紹查詢優(yōu)化器是如何工作的。如果你想知道MySQL采用的優(yōu)化手段,可以查看MySQL參考手冊。
          
          當然,MySQL查詢優(yōu)化器也利用了索引,但是它也使用了其它一些信息。例如,如果你提交如下所示的查詢,那么無論數(shù)據(jù)表有多大,MySQL執(zhí)行它的速度都會非常快:
          
          SELECT * FROM tbl_name WHERE 0;
          
          在這個例子中,MySQL查看WHERE子句,認識到?jīng)]有符合查詢條件的數(shù)據(jù)行,因此根本就不考慮搜索數(shù)據(jù)表。你可以通過提供一個EXPLAIN語句看到這種情況,這個語句讓MySQL顯示自己執(zhí)行的但實際上沒有真正地執(zhí)行的SELECT查詢的一些信息。如果要使用EXPLAIN,只需要在EXPLAIN單詞放在SELECT語句的前面:
          
          mysql> EXPLAIN SELECT * FROM tbl_name WHERE 0\G
          *************************** 1. row ***************************
          id: 1
          select_type: SIMPLE
          table: NULL
          type: NULL
          possible_keys: NULL
          key: NULL
          key_len: NULL
          ref: NULL
          rows: NULL
          Extra: Impossible WHERE
          
          通常情況下,EXPLAIN返回的信息比上面的信息要多一些,還包括用于掃描數(shù)據(jù)表的索引、使用的聯(lián)結類型、每張數(shù)據(jù)表中估計需要檢查的數(shù)據(jù)行數(shù)量等非空(NULL)信息。
          
          優(yōu)化器是如何工作的
          
          MySQL查詢優(yōu)化器有幾個目標,但是其中最主要的目標是盡可能地使用索引,并且使用最嚴格的索引來消除盡可能多的數(shù)據(jù)行。你的最終目標是提交SELECT語句查找數(shù)據(jù)行,而不是排除數(shù)據(jù)行。優(yōu)化器試圖排除數(shù)據(jù)行的原因在于它排除數(shù)據(jù)行的速度越快,那么找到與條件匹配的數(shù)據(jù)行也就越快。如果能夠首先進行最嚴格的測試,查詢就可以執(zhí)行地更快。假設你的查詢檢驗了兩個數(shù)據(jù)列,每個列上都有索引:
          
          SELECT col3 FROM mytable
          WHERE col1 = ’some value’ AND col2 = ’some other value’;
          
          假設col1上的測試匹配了900個數(shù)據(jù)行,col2上的測試匹配了300個數(shù)據(jù)行,而同時進行的測試只得到了30個數(shù)據(jù)行。先測試Col1會有900個數(shù)據(jù)行,需要檢查它們找到其中的30個與col2中的值匹配記錄,其中就有870次是失敗了。先測試col2會有300個數(shù)據(jù)行,需要檢查它們找到其中的30個與col1中的值匹配的記錄,只有270次是失敗的,因此需要的計算和磁盤I/O更少。其結果是,優(yōu)化器會先測試col2,因為這樣做開銷更小。
          
          你可以通過下面一個指導幫助優(yōu)化器更好地利用索引:
          
          盡量比較數(shù)據(jù)類型相同的數(shù)據(jù)列。當你在比較操作中使用索引數(shù)據(jù)列的時候,請使用數(shù)據(jù)類型相同的列。相同的數(shù)據(jù)類型比不同類型的性能要高一些。例如,INT與BIGINT是不同的。CHAR(10)被認為是CHAR(10)或VARCHAR(10),但是與CHAR(12)或VARCHAR(12)不同。如果你所比較的數(shù)據(jù)列的類型不同,那么可以使用ALTER TABLE來修改其中一個,使它們的類型相匹配。
          
          盡可能地讓索引列在比較表達式中獨立。如果你在函數(shù)調用或者更復雜的算術表達式條件中使用了某個數(shù)據(jù)列,MySQL就不會使用索引,因為它必須計算出每個數(shù)據(jù)行的表達式值。有時候這種情況無法避免,但是很多情況下你可以重新編寫一個查詢讓索引列獨立地出現(xiàn)。
          
          下面的WHERE子句顯示了這種情況。它們的功能相同,但是對于優(yōu)化目標來說就有很大差異了:
          
          WHERE mycol < 4 / 2
          WHERE mycol * 2 < 4
          
          對于第一行,優(yōu)化器把表達式4/2簡化為2,接著使用mycol上的索引來快速地查找小于2的值。對于第二個表達式,MySQL必須檢索出每個數(shù)據(jù)行的mycol值,乘以2,接著把結果與4進行比較。在這種情況下,不會使用索引。數(shù)據(jù)列中的每個值都必須被檢索到,這樣才能計算出比較表達式左邊的值。
          
          我們看另外一個例子。假設你對date_col列進行了索引。如果你提交一條如下所示的查詢,就不會使用這個索引:
          
          SELECT * FROM mytbl WHERE YEAR(date_col) < 1990;
          
          這個表達式不會把1990與索引列進行比較;它會把1990與該數(shù)據(jù)列計算出來的值比較,而每個數(shù)據(jù)行都必須計算出這個值。其結果是,沒有使用date_col上的索引,因為執(zhí)行這樣的查詢需要全表掃描。怎么解決這個問題呢?只需要使用文本日期,接著就可以使用date_col上的索引來查找列中匹配的值了:
          
          WHERE date_col < ’1990-01-01’
          
          但是,假設你沒有特定的日期。你可能希望找到一些與今天相隔固定的幾天的日期的記錄。表達這種類型的比較有很多種方法--它們的效率并不同。下面就有三種:
          
          WHERE TO_DAYS(date_col) - TO_DAYS(CURDATE()) < cutoff
          WHERE TO_DAYS(date_col) < cutoff + TO_DAYS(CURDATE())
          WHERE date_col < DATE_ADD(CURDATE(), INTERVAL cutoff DAY)
          
          對于第一行,不會用到索引,因為每個數(shù)據(jù)行都必須檢索以計算出TO_DAYS(date_col)的值。第二行要好一些。Cutoff和TO_DAYS(CURDATE())都是常量,因此在處理查詢之前,比較表達式的右邊可以被優(yōu)化器一次性計算出來,而不需要每個數(shù)據(jù)行都計算一次。但是date_col列仍然出現(xiàn)在函數(shù)調用中,它阻止了索引的使用。第三行是這幾個中最好的。同樣,在執(zhí)行查詢之前,比較表達式的右邊可以作為常量一次性計算出來,但是現(xiàn)在它的值是一個日期。這個值可以直接與date_col值進行比較,再也不需要轉換成天數(shù)了。在這種情況下,會使用索引。
          
          在LIKE模式的開頭不要使用通配符。有些字符串搜索使用如下所示的WHERE子句:
          
          WHERE col_name LIKE ’%string%’
          
          如果你希望找到那些出現(xiàn)在數(shù)據(jù)列的任何位置的字符串,這個語句就是對的。但是不要因為習慣而簡單地把"%"放在字符串的兩邊。如果你在查找出現(xiàn)在數(shù)據(jù)列開頭的字符串,就刪掉前面的"%"。假設你要查找那些類似MacGregor或MacDougall等以"Mac"開頭的名字。在這種情況下,WHERE子句如下所示:
          
          WHERE last_name LIKE ’Mac%’
          
          優(yōu)化器查看該模式中詞首的文本,并使用索引找到那些與下面的表達式匹配的數(shù)據(jù)行。下面的表達式是使用last_name索引的另一種形式:
          
          WHERE last_name >= ’Mac’ AND last_name < ’Mad’
          
          這種優(yōu)化不能應用于使用了REGEXP操作符的模式匹配。REGEXP表達式永遠不會被優(yōu)化。
          
          幫助優(yōu)化器更好的判斷索引的效率。在默認情況下,當你把索引列的值與常量進行比較的時候,優(yōu)化器會假設鍵值在索引內部是均勻分布的。在決定進行常量比較是否使用索引的時候,優(yōu)化器會快速地檢查索引,估計出會用到多少個實體(entry)。對應MyISAM、InnoDB和BDB數(shù)據(jù)表來說,你可以使用ANALYZE TABLE讓服務器執(zhí)行對鍵值的分析。它會為優(yōu)化器提供更好的信息。
          
          使用EXPLAIN驗證優(yōu)化器的操作。EXPLAIN語句可以告訴你是否使用了索引。當你試圖用另外的方式編寫語句或檢查添加索引是否會提高查詢執(zhí)行效率的時候,這些信息對你是有幫助的。
          
          在必要的時候給優(yōu)化器一些提示。正常情況下,MySQL優(yōu)化器自由地決定掃描數(shù)據(jù)表的次序來最快地檢索數(shù)據(jù)行。在有些場合中優(yōu)化器沒有作出最佳選擇。如果你察覺這種現(xiàn)象發(fā)生了,就可以使用STRAIGHT_JOIN關鍵字來重載優(yōu)化器的選擇。帶有STRAIGHT_JOIN的聯(lián)結類似于交叉聯(lián)結,但是強迫數(shù)據(jù)表按照FROM子句中指定的次序來聯(lián)結。
          
          在SELECT語句中有兩個地方可以指定STRAIGHT_JOIN。你可以在SELECT關鍵字和選擇列表之間的位置指定,這樣會對語句中所有的交叉聯(lián)結產(chǎn)生影響;你也可以在FROM子句中指定。下面的兩個語句功能相同:
          
          SELECT STRAIGHT_JOIN ... FROM t1, t2, t3 ... ;
          SELECT ... FROM t1 STRAIGHT_JOIN t2 STRAIGHT_JOIN t3 ... ;
          
          分別在帶有STRAIGHT_JOIN和不帶STRAIGHT_JOIN的情況下運行這個查詢;MySQL可能因為什么原因沒有按照你認為最好的次序使用索引(你可以使用EXPLAIN來檢查MySQL處理每個語句的執(zhí)行計劃)。
          
          你還可以使用FORCE INDEX、USE INDEX或IGNORE INDEX來指導服務器如何使用索引。
          
          利用優(yōu)化器更加完善的區(qū)域。MySQL可以執(zhí)行聯(lián)結和子查詢,但是子查詢是最近才支持的,是在MySQL 4.1中添加的。因而在很多情況下,優(yōu)化器對聯(lián)結操作的調整比對子查詢的調整要好一些。當你的子查詢執(zhí)行地很慢的時候,這就是一條實際的提示。有一些子查詢可以使用邏輯上相等的聯(lián)結來重新表達。在可行的情況下,你可以把子查詢重新改寫為聯(lián)結,看是否執(zhí)行地快一些。
          
          測試查詢的備用形式,多次運行。當你測試查詢的備用形式的時候(例如,子查詢與等同的聯(lián)結操作對比),每種方式都應該多次運行。如果兩種形式都只運行了一次,那么你通常會發(fā)現(xiàn)第二個查詢比第一個快,這是因為第一個查詢得到的信息仍然保留在緩存中,以至于第二個查詢沒有真正地從磁盤上讀取數(shù)據(jù)。你還應該在系統(tǒng)負載相對平穩(wěn)的時候運行查詢,以避免系統(tǒng)中其它的事務影響結果。
          
          避免過度地使用MySQL自動類型轉換。MySQL會執(zhí)行自動的類型轉換,但是如果你能夠避免這種轉換操作,你得到的性能就更好了。例如,如果num_col是整型數(shù)據(jù)列,那么下面這些查詢將返回相同的結果:
          
          SELECT * FROM mytbl WHERE num_col = 4;
          SELECT * FROM mytbl WHERE num_col = ’4’;
          
          但是第二個查詢涉及到了類型轉換。轉換操作本身為了把整型和字符串型轉換為雙精度型進行比較,使性能惡化了。更嚴重的情況是,如果num_col是索引的,那么涉及到類型轉換的比較操作不會使用索引。

        聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        MySQL查詢優(yōu)化系列講座之查詢優(yōu)化器_MySQL

        MySQL查詢優(yōu)化系列講座之查詢優(yōu)化器_MySQL:MySQL優(yōu)化MySQL查詢 當你提交一個查詢的時候,MySQL會分析它,看是否可以做一些優(yōu)化使處理該查詢的速度更快。這一部分將介紹查詢優(yōu)化器是如何工作的。如果你想知道MySQL采用的優(yōu)化手段,可以查看MySQL參考手冊。 當然,MySQL查詢優(yōu)化器也利用了索引,但
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久久久亚洲av无码专区导航 | 亚洲AV永久无码精品成人| 另类图片亚洲校园小说区| 国产精品成人四虎免费视频| 亚洲熟妇少妇任你躁在线观看| 和日本免费不卡在线v| 亚洲制服丝袜一区二区三区| 美女网站免费福利视频| 亚洲日韩国产一区二区三区在线| 成人毛片免费视频| 日韩国产欧美亚洲v片 | 日本高清免费中文字幕不卡| 午夜亚洲WWW湿好爽 | 免费在线精品视频| 一级毛片a免费播放王色| 久久久久久久综合日本亚洲| 免费一级毛片无毒不卡| 亚洲美女激情视频| 国内免费高清在线观看| 美女露隐私全部免费直播| 亚洲中文字幕无码中文字在线| 香港a毛片免费观看| 天天爽亚洲中文字幕| 国产乱弄免费视频| 美女在线视频观看影院免费天天看| 亚洲网址在线观看你懂的| 毛片网站免费在线观看| 免费一区二区无码视频在线播放 | 亚洲国产精品尤物YW在线观看| 青青操免费在线视频| 精品日韩99亚洲的在线发布| 日韩一区二区三区免费体验| 国产伦精品一区二区免费| 亚洲精品在线视频观看| 国产一精品一aⅴ一免费| a级毛片免费高清毛片视频| 亚洲av无码片在线观看| 伊人亚洲综合青草青草久热| 国产91免费在线观看| 九九免费久久这里有精品23| 亚洲福利视频网站|