標籤:搜尋 測試 add pac -- 索引 文章 body 例子
轉自http://blog.csdn.net/zhanyan_x/article/details/25294539
-- WHERE執行順序
-- 過濾比較多的放在前面,然後更加容易匹配,從左至右進行執行;一般都是最佳化器很智能的最佳化了,無需使用者處理
-- 如何查看最佳化後的語句
EXPLAIN EXTENDED
SELECT SQL_NO_CACHE * FROM db.table
WHERE is_day=1 AND DATE(ex_date)=‘2015-07-01‘ ;
SHOW WARNINGS;
-- 第一種確實比第二種要慢一點
EXPLAIN EXTENDED
SELECT SQL_NO_CACHE * FROM TABLE
WHERE is_day=1 AND run_date=‘2015-07-01‘
EXPLAIN EXTENDED
SELECT SQL_NO_CACHE * FROM TABLE
WHERE run_date=‘2015-07-01‘ AND is_day=1
此文章主要向大家描述的是MySQL查詢最佳化系列之MySQL查詢最佳化工具,當你在對一查詢進行提交的時候,MySQL資料庫會對它進行分析,主要是看其是否可以用來做一些最佳化使處理該查詢的速度更快。
這一部分將介紹查詢最佳化工具是如何工作的。如果你想知道MySQL採用的最佳化手段,可以查看MySQL參考手冊。
當然,MySQL查詢最佳化工具也利用了索引,但是它也使用了其它一些資訊。例如,如果你提交如下所示的查詢,那麼無論資料表有多大,MySQL執行它的速度都會非常快:
SELECT * FROM tbl_name WHERE 0;
在這個例子中,MySQL查看WHERE子句,認識到沒有符合查詢條件的資料行,因此根本就不考慮搜尋資料表。你可以通過提供一個EXPLAIN語句看到這種情況,這個語句讓MySQL顯示自己執行的但實際上沒有真正地執行的SELECT查詢的一些資訊。如果要使用EXPLAIN,只需要在EXPLAIN單詞放在SELECT語句的前面:
MySQL> EXPLAIN SELECT * FROM tbl_name WHERE 0\G 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返回的資訊比上面的資訊要多一些,還包括用於掃描資料表的索引、使用的連接類型、每張資料表中估計需要檢查的資料行數量等非空(NULL)資訊。
最佳化器是如何工作的
MySQL查詢最佳化工具有幾個目標,但是其中最主要的目標是儘可能地使用索引,並且使用最嚴格的索引來消除儘可能多的資料行。你的最終目標是提交SELECT語句尋找資料行,而不是排除資料行。
最佳化器試圖排除資料行的原因在於它排除資料行的速度越快,那麼找到與條件匹配的資料行也就越快。如果能夠首先進行最嚴格的測試,查詢就可以執行地更快。假設你的查詢檢驗了兩個資料列,每個列上都有索引:
SELECT col3 FROM mytable WHERE col1 = ’some value’ AND col2 = ’some other value’;
假設col1上的測試匹配了900個資料行,col2上的測試匹配了300個資料行,而同時進行的測試只得到了30個資料行。先測試Col1會有900個資料行,需要檢查它們找到其中的30個與col2中的值匹配記錄,其中就有870次是失敗了。
先測試col2會有300個資料行,需要檢查它們找到其中的30個與col1中的值匹配的記錄,只有270次是失敗的,因此需要的計算和磁碟I/O更少。其結果是,最佳化器會先測試col2,因為這樣做開銷更小。
1025WHERE執行順序以及MySQL查詢最佳化工具