如何正确高效使用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的索引–索引优化策略

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