對於 B-tree 和 hash 數據結構的理解能夠有助於預測不同存儲引擎下使用不同索引的查詢性能的差異,尤其是那些允許你選擇 B-tree 或者 hash 索引的內存存儲引擎。
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE other_col;
... WHERE index_part1=1 AND index_part2=2 AND other_column=3 /* index = 1 OR index = 2 */ ... WHERE index=1 OR A=10 AND index=2 /* optimized like "index_part1='hello'" */ ... WHERE index_part1='hello' AND index_part3=5 /* Can use index on index1 but not on index2 or index3 */ ... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;
/* index_part1 is not used */ ... WHERE index_part2=1 AND index_part3=2 /* Index is not used in both parts of the WHERE clause */ ... WHERE index=1 OR A=10 /* No index spans all rows */ ... WHERE index_part1=1 OR index_part2=10
有時,即使有索引可以使用,MySql 也不使用任何索引。發生這種情況的場景之一就是優化器估算出使用該索引將要求 MySql 去訪問這張表的絕大部分記錄。這種情況下,一個表掃描可能更快,因為它要求更少量的查詢。但是,如果這樣的一個查詢使用了 LIMIT 來檢索只是少量的記錄時,MySql 還是會使用索引,因為它能夠更快地找到這點記錄並將其返回。