为什么要使用索引
- 索引大大减少了存储引擎需要扫描的数据量
- 索引可以用于排序以避免使用临时表,减少磁盘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的索引–索引优化策略