查詢優化器的提示(hint)

                             查詢優化器的提示(hint)


 如果對優化器選擇的執行計劃不滿意,可以使用優化器提供的幾個提示(hint)來控制最終的執行計劃。

相關提示如下:

HIGH_PRIORITY 和LOW_PRIORITY(當多個語句同時訪問 一個表時,語句執行的 優先級)
HIGH_PRIORITY 用於select語句時,會將此語句重新調度到所有正在等待表鎖以便修改數據的語句之前。放在insert語句之前時只是簡單地抵消全局LOW_PRIORITY設置對該語句的影響。
LOW_PRIORITY會 讓語句一直處於等待狀態,只要隊列中還有需要執行的語句。可以再select、insert、update、delete語句中使用。
這兩個提示只對使用表鎖的存儲引擎有效,千萬不要再InnoDB或者其他細粒度的鎖機制和 併發控制的 引擎中使用。

DELAYED(將語句執行結果立即返回給客戶端)
適合於insert和replace。mysql會先返回客戶端結果,再將插入的行數據放入到緩衝區,然後在表空閒時批量 將數據寫入磁盤。適合日誌系統使用,但是該提示會導致函數LAST_INSERT_ID()無法正常工作。

STRAIGHT_JOIN(與關聯表的順序有關)
當放在select語句的select 關鍵字之後時,表示讓查詢中所有的表按照在語句 中出現的順序關聯;
當放在任何兩張關聯表的名字之間時,表示固定其前後兩個表的關聯順序。
使用這個提示可以大大提高優化器的效率。

SQL_SMALL_RESULT 和 SQL_BIG_RESULT(告訴優化器對group by 或者distinct查詢如何使用臨時表及排序)
只對select 語句有效。SQL_SMALL_RESULT告訴優化器結果集會很小,可以將結果集放在內存中的索引臨時表,以避免排序操作。  SQL_BIG_RESULT則告訴優化器結果集可能會非常大,建議使用磁盤臨時表做排序操作。

SQL_BUFFER_RESULT(告訴優化器將查詢結果放入到一個臨時表,釋放表鎖)
當你沒法使用客戶端緩存的時候,使用服務端的緩存通常很有效。代價是,服務器端將需要更多的內存。

SQL_CACHE 和SQL_NO_CACHE(告訴mysql是否需要將結果集緩存子查詢緩存中)

SQL_CALC_FOUND_ROWS(讓mysql返回的結果集包含更多的信息)

FOR UPDATE 和 LOCK IN SHARE MODE(控制select 語句的鎖機制,但只對實現了行級鎖的存儲引擎有效)
對符合查詢條件的數據行加鎖。唯一內置的支持這兩個提示的引擎是InnoDB。這兩個提示會讓某些優化無法正常使用,例如索引覆蓋掃描。InnoDB不能在不訪問主鍵的情況下排他地鎖定行,因爲行的版本信息保存在主鍵中。

USE INDEX、IGNORE INDEX 和FORCE INDEX(告訴優化器使用或者不使用哪些索引來查詢記錄)
在mysql5.1之前,這些提示並不會影響到優化器選擇哪個索引進行排序和分組。
在mysql5.1之後,可以通過新增for order by 和 for group by 來指定是否對排序和分組有效。
FORCE I NDEX 和 USE INDEX基本相同,除了一點:FORCE INDEX會告訴優化器全表掃描的成本會遠遠高於索引掃描,哪怕實際上該索引用處不大。

在mysql5.0之後,新增加一些參數來控制優化器的行爲:
optimizer_search_depth:這個參數控制優化器在窮舉執行計劃時的限度。如果查詢長時間處於“statistics”狀態,那麼可以考慮調低此參數。
optimizer_prun_level:默認打開,根據需要掃描的行數來決定是否跳過某些執行計劃。
optimizer_switch:這個變量包含了一些開啓/關閉優化器特性的標誌位。例如可以通過這個參數控制禁用索引合併的特性。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章