如何正確高效使用mysql數據庫的索引——Btree索引和Hash索引

爲什麼要使用索引

  • 索引大大減少了存儲引擎需要掃描的數據量
  • 索引可以用於排序以避免使用臨時表,減少磁盤I/O消耗,提高Mysql處理能力
  • 索引可以把隨機I/O轉變爲順序I/O,更加充分發揮磁盤I/O性能

Mysql支持的索引類型

  • B-tree索引
  • Hash索引

B-tree索引的特點

  • B-tree索引能夠加快數據的查詢速度
  • B-tree索引更適合進行範圍查找

在什麼情況下使用B樹索引

  1. 全值匹配的查詢
    例:order_sn= ‘239090’
  2. 匹配最左前綴的查詢
    解釋:當多個列組成聯合索引時,只有匹配到索引第一個列時,索引纔會生效
    例:order_sn列和order_date列組成聯合索引,當查詢條件爲order_sn或者order_sn和order_date時,可以使用聯合索引;當查詢條件只有order_date列時,聯合索引不生效。
  3. 匹配列前綴的查詢
    例:order_sn like ‘2390%’
  4. 匹配範圍值的查詢
    例:order_sn > ‘239000’ and order_sn < ‘239999’
  5. 精確匹配左前列並範圍匹配另外一列
    例:order_sn列和order_date列組成聯合索引,精確匹配order_sn列,而order_date進行範圍匹配
  6. 只訪問索引的查詢
  7. 分組查詢
    例:group by order_date
  8. 查詢排序
    例:order by order_sn

B樹索引的使用限制

  1. 如果不是按照索引最左列開始查找,則無法使用索引
    解釋:多列組成聯合做引,如果不能匹配到改索引的最左列字段,則不能使用索引
    例:order_sn列和order_date列組成聯合索引,當查詢條件爲order_sn或者order_sn和order_date時,可以使用聯合索引;當查詢條件只有order_date列時,聯合索引不生效。
  2. 在使用索引時不能跳過索引左邊的列
    例:order_date,user_name,user_phone組成聯合索引,當查詢條件中只包含order_date和user_phone列,只能使用order_date進行查詢過濾,而不能使用到user_phone列,因爲查詢條件中跳過了user_name列
  3. not in 和 <> 操作無法使用索引
  4. 如果查詢中有某個列的範圍查詢,則其右邊所有列都無法使用索引
    例:order_date,user_name,user_phone組成聯合索引,當查詢條件中包含order_date,user_name,user_phone列,其中order_date進行範圍查找,則user_name列和user_phone無法使用索引,因爲order_date列使用了範圍查詢

Hash索引的特點

  1. Hash索引是基於Hash表實現的,只有查詢條件精確匹配Hash索引中的所有列時,才能夠使用到Hash索引
  2. 對於Hash索引中的所有列,存儲引擎都會爲每一行計算一個Hash碼,Hash索引中存儲的就是Hash碼

Hash索引的限制

  1. Hash索引必須使用二次查找
  2. Hash索引無法使用排序
  3. Hash索引不支持部分索引查找也不支持範圍查找
  4. Hash索引中Hash碼計算可能存在Hash衝突

索引是不是越多越好

  • 索引會增加寫操作的成本,索引越多,數據寫入所需時間越長
  • 太多索引會增加查詢優化器的選擇時間

相關文章

如何正確高效使用mysql的索引–SQL查詢優化
如何正確高效使用mysql的索引–索引優化策略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章