爲什麼要使用索引
- 索引大大減少了存儲引擎需要掃描的數據量
- 索引可以用於排序以避免使用臨時表,減少磁盤I/O消耗,提高Mysql處理能力
- 索引可以把隨機I/O轉變爲順序I/O,更加充分發揮磁盤I/O性能
Mysql支持的索引類型
B-tree索引的特點
- B-tree索引能夠加快數據的查詢速度
- B-tree索引更適合進行範圍查找
在什麼情況下使用B樹索引
- 全值匹配的查詢
例:order_sn= ‘239090’
- 匹配最左前綴的查詢
解釋:當多個列組成聯合索引時,只有匹配到索引第一個列時,索引纔會生效
例:order_sn列和order_date列組成聯合索引,當查詢條件爲order_sn或者order_sn和order_date時,可以使用聯合索引;當查詢條件只有order_date列時,聯合索引不生效。
- 匹配列前綴的查詢
例:order_sn like ‘2390%’
- 匹配範圍值的查詢
例:order_sn > ‘239000’ and order_sn < ‘239999’
- 精確匹配左前列並範圍匹配另外一列
例:order_sn列和order_date列組成聯合索引,精確匹配order_sn列,而order_date進行範圍匹配
- 只訪問索引的查詢
- 分組查詢
例:group by order_date
- 查詢排序
例:order by order_sn
B樹索引的使用限制
- 如果不是按照索引最左列開始查找,則無法使用索引
解釋:多列組成聯合做引,如果不能匹配到改索引的最左列字段,則不能使用索引
例:order_sn列和order_date列組成聯合索引,當查詢條件爲order_sn或者order_sn和order_date時,可以使用聯合索引;當查詢條件只有order_date列時,聯合索引不生效。
- 在使用索引時不能跳過索引左邊的列
例:order_date,user_name,user_phone組成聯合索引,當查詢條件中只包含order_date和user_phone列,只能使用order_date進行查詢過濾,而不能使用到user_phone列,因爲查詢條件中跳過了user_name列
- not in 和 <> 操作無法使用索引
- 如果查詢中有某個列的範圍查詢,則其右邊所有列都無法使用索引
例:order_date,user_name,user_phone組成聯合索引,當查詢條件中包含order_date,user_name,user_phone列,其中order_date進行範圍查找,則user_name列和user_phone無法使用索引,因爲order_date列使用了範圍查詢
Hash索引的特點
- Hash索引是基於Hash表實現的,只有查詢條件精確匹配Hash索引中的所有列時,才能夠使用到Hash索引
- 對於Hash索引中的所有列,存儲引擎都會爲每一行計算一個Hash碼,Hash索引中存儲的就是Hash碼
Hash索引的限制
- Hash索引必須使用二次查找
- Hash索引無法使用排序
- Hash索引不支持部分索引查找也不支持範圍查找
- Hash索引中Hash碼計算可能存在Hash衝突
索引是不是越多越好
- 索引會增加寫操作的成本,索引越多,數據寫入所需時間越長
- 太多索引會增加查詢優化器的選擇時間
相關文章
如何正確高效使用mysql的索引–SQL查詢優化
如何正確高效使用mysql的索引–索引優化策略