mysql是一種常用的關系型數(shù)據(jù)庫系統(tǒng),提供了多種優(yōu)化機制,其中最關鍵的是優(yōu)化器。優(yōu)化器負責在執(zhí)行sql語句的時候,選擇合適的索引來提高查詢效率。那么,mysql的優(yōu)化器是如何選擇索引的呢?
首先,mysql會依據(jù)查詢條件進行表掃描,比如說我們要查詢表中,age>18的記錄。mysql會掃描表中所有的記錄,然后判斷哪些記錄符合條件。這個過程非常費時間,尤其是對于大表而言。
一個更好的辦法是使用索引。假設我們在age字段上創(chuàng)建了一個B樹索引。那么,mysql在掃描表的時候,會直接在B樹索引中查找符合條件的記錄,而不是掃描整個表。這個過程非常高效,因為B樹索引對于快速查找符合條件的記錄來說,非常快速。
由于mysql的優(yōu)化器不知道我們剛剛在age字段上創(chuàng)建了B樹索引,因此,mysql需要自己決定使用哪個索引進行查詢。為了做出這個決策,mysql會先進行一個代價估算的過程。即,mysql會計算每個可用索引執(zhí)行查詢所需要的時間,然后選取代價最小的那個索引。
當然,代價估算的過程是非常復雜的。因為代價不僅包含了查詢所需要的時間,還包括了鎖定資源、磁盤IO等因素的代價。因此,一個好的索引選擇器需要考慮非常多的因素,而mysql的優(yōu)化器就是如此。
SELECT * FROM users WHERE age >18; -- 假設age字段上有兩個索引,分別是idx1和idx2 -- mysql會計算使用idx1和idx2執(zhí)行查詢的代價,并選擇代價更小的那個索引