B-Tree索引能夠被用在像=,>,>=,<,<=和BETWEEN這些比較操做符上。並且還能夠用於LIKE操做符,只要它的查詢條件是一個不以通配符開頭的常量。像下面的語句就可使用索引:mysql
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';算法
下面這兩種狀況不會使用索引:sql
第一條是由於它以通配符開頭,第二條是由於沒有使用常量。函數
假如你使用... LIKE '%string%'並且string超過三個字符,MYSQL使用Turbo Boyer-Moore algorithm算法來初始化查詢表達式,而後用這個表達式來讓查詢更迅速。性能
一個這樣的查詢col_name IS NULL是可使用col_name的索引的。優化
任何一個沒有覆蓋全部WHERE中AND級別條件的索引是不會被使用的。spa
也就是說,要使用一個索引,這個索引中的第一列須要在每一個AND組中出現。指針
下面的WHERE條件會使用索引:code
下面的WHERE條件不會使用索引:排序
有時候mysql不會使用索引,即便這個在可用的狀況下。例如當mysql預估使用索引會讀取大部分的行數據時。(在這種狀況下,一次全表掃描可能比使用索引更快,由於它須要更少的檢索)。然而,假如語句中使用LIMIT來限定返回的行數,mysql則會使用索引。由於當結果行數較少的狀況下使用索引的效率會更高。
Hash類型的索引有一些區別於以上所述的特徵:
1.它們只能用於對等比較,例如=、in、<=>操做符(可是快不少)。它們不能被用於像<這樣的範圍查詢條件。假如系統只須要使用像「鍵值對」的這樣的存儲結構,儘可能使用hash類型索引。
2.優化器不能用hash索引來爲ORDER BY操做符加速。(這類索引不能被用於搜索下一個次序的值)
3.mysql不能判斷出兩個值之間有多少條數據(這須要使用範圍查詢操做符來決定使用哪一個索引)。假如你將一個MyISAM錶轉爲一個依靠hash索引的MEMORY表,可能會影響一些語句(的性能)。
4.只有完整的鍵才能被用於搜索一行數據。(假如用B-tree索引,任何一個鍵的片斷均可以用於查找。我以爲可能意味着帶通配符LIKE操做符會不起做用)。
5. Hash索引任什麼時候候都不能避免表掃描
Hash索引是將索引鍵經過Hash運算以後,將Hash運算結果的Hash值和所對應的行指針信息存放於一個Hash表中,因爲不一樣索引鍵存在相同Hash值,因此即便知足某個Hash鍵值的數據的記錄條數,也沒法從Hash索引中直接完成查詢,仍是要經過訪問表中的實際數據進行比較,並獲得相應的結果。