當你提交一個查詢的時候MySQL會分析它看是否可以做一些優化使處理該查詢的速度更快這一部分將介紹查詢優化器是如何工作的如果你想知道MySQL采用的優化手段可以查看MySQL參考手冊
當然MySQL查詢優化器也利用了索引但是它也使用了其它一些信息例如如果你提交如下所示的查詢那麼無論數據表有多大MySQL執行它的速度都會非常快
SELECT * FROM tbl_name WHERE ;
在這個例子中MySQL查看WHERE子句認識到沒有符合查詢條件的數據行因此根本就不考慮搜索數據表你可以通過提供一個EXPLAIN語句看到這種情況這個語句讓MySQL顯示自己執行的但實際上沒有真正地執行的SELECT查詢的一些信息如果要使用EXPLAIN只需要在EXPLAIN單詞放在SELECT語句的前面
mysql> EXPLAIN SELECT * FROM tbl_name WHERE \G
***************************
row ***************************
id:
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 col FROM mytable
WHERE col = some value AND col = some other value;
假設col上的測試匹配了個數據行col上的測試匹配了個數據行而同時進行的測試只得到了個數據行先測試Col會有個數據行需要檢查它們找到其中的個與col中的值匹配記錄其中就有次是失敗了先測試col會有個數據行需要檢查它們找到其中的個與col中的值匹配的記錄只有次是失敗的因此需要的計算和磁盤I/O更少其結果是優化器會先測試col因為這樣做開銷更小
From:http://tw.wingwit.com/Article/program/MySQL/201311/29623.html