2012-03-05 80 views
1

我一直在研究指標並不能完全理解MYSQL如何能夠使用索引在所有的像如何MySQL的穿越複合B樹索引的IN()和()搜索

IN() AND IN() ... AND IN() 
聲明

這本書我讀表明,當我們有(ab,...),但用戶想搜索b的指標,我們有一個a低基數,我們可以使用一個技巧和簡單的添加IN( )

WHERE a IN ('x1', 'x2', ... 'all possible values go here') AND `b`>123 

讓的說我們有以下數據

x1 1 
x1 4 
x1 456 
x2 5 
x3 1 
x3 2 
x3 3 
x4 1234 

如何遍歷此樹來滿足上面的查詢?它是否簡單地爲IN-s創建所有可能的組合,並且幾乎遍歷每個這些查詢的樹?

WHERE `a`='x1' AND `b`>123 
WHERE `a`='x2' AND `b`>123 
... 

因此使有限的有用的這一招,因爲由於在-S的數量增加,所有可能的IN組合的數量急劇增加,我們必須通過B樹的每個組合的運行?如果以上情況屬實,這是否意味着有一些理論上的觀點,用IN來欺騙索引的速度會慢於根本不使用索引?

回答

-1

你是對的。

對於這種類型的IN優化,MySQL使用相同的技術,它在執行JOIN時使用,並且MySQL能夠進行大量的JOIN,而不會對性能產生明顯影響。儘管成本最終可以達到成爲顯而易見的程度,但它通常比不使用指數更具優勢。

根本不使用索引只有在返回大部分行時纔有優勢。 MySQL能夠決定何時放棄索引。