4.2 MySQL 查詢優化程序
在發布一個選擇行的查詢時, MySQL 進行分析,看是否能夠對它進行優化,使它執行更快。本節中,我們將研究查詢優化程序怎樣工作。更詳細的信息,可參閱MySQL 參考指南中的“Getting Maximum Performance from MySQL”,該章描述了MySQL 采用的各種優化措施。該章中的信息會不斷變化,因為MySQL 的開發者不斷對優化程序進行改進,因此,有必要經常拜訪一下該章,看看是否有可供利用的新技巧。(h t t p : / / w w w.mysql.com/ 處的MySQL 聯機參考指南在不斷地更新。)
MySQL 查詢優化程序利用了索引。當然,它也利用了其他信息。例如,如果發布下列查詢,MySQL 將非常快地執行它,不管相應的表有多大:
SELECT * FROM tb1_name WHERE 1 = 0
在此情形中,MySQL 考察WHERE 子句,如果認識到不可能有滿足該查詢的行,就不會對該表進行搜索。可利用EXPLAIN 語句知道這一點,EXPLAIN 語句要求MySQL 顯示某些有關它應該執行一條SELECT 查詢,而實際沒有執行的信息。為了使用E X P L A I N,只需要SELECT 語句前放置EXPLAIN 即可,如下所示:
EXPLAIN SELECT * FROM tb1_name WHERE 1 = 0
通常,EXPLAIN 返回的信息比這個多,包括將用來掃描表的索引、將要使用的連接類型以及需要在每個表中掃描的行數估計等等。
4.2.1 優化程序怎樣工作
MySQL 查詢優化程序有幾個目標,但其主要目標是盡量利用索引,而且盡量使用最具有限制性的索引以排除盡可能多的行。這樣做可能會適得其反,因為發布一條SELECT 語句的目的是尋找行,而不是拒絕它們。優化程序這樣工作的原因是從要考慮的行中排除行越快,那麼找到確實符合給出標准的行就越快。如果能夠首先進行最具限制性的測試,則查詢可以進行得更快。假如有一個測試兩列的查詢,每列上都有一個索引:
WHERE coll = "some value" AND col2 = "some other value"