SQL优化--索引

来源:互联网 发布:js代码的执行顺序 编辑:程序博客网 时间:2024/06/16 16:01

MYSQL目前支持4种索引:

  1. B-Tree索引:最常见的索引类型,大部分引擎都支持B树索引。
  2. Hash索引:只有Memory引擎支持,使用场景简单。
  3. R-Tree索引(空间索引) :空间索引是MyISAM的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少。
  4. Full-Text(全文索引):也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从MySQL5.6版本开始提供对全文索引的支持。
索引MyISAM引擎InnoDB引擎Memory引擎B-Tree索引支持支持支持HASH索引不支持不支持支持R-Tree索引支持不支持不支持Full-text索引支持暂不支持不支持

总结:Hash索引相对简单,只有Memory/Heap引擎支持Hash索引,因为适用于Key-Value查询,所以比B树更快,但它不适用范围查询。Memory/Heap引擎只有在“=”的条件下才会使用索引。

在利用B-Tree索引时,可以进行全关键字、关键字范围和关键字前缀查询。

  • 全关键字:explain输出结果中字段type的值const,表示是常量。
  • 关键字范围:type为range
  • 匹配最左前缀:type为ref。注意,在col1+col2+col3字段上的联合索引能够被包含col1、(col1+col2)、(col1+col2+col3)的等值查询利用到,不能被col2、(col2+col3)的等值查询利用到。
    -仅仅对索引进行查询:当查询的列都在索引的字段中时,查询的效率更高。
    匹配列前缀:仅仅使用索引中的第一列,并且值包含索引第一列的开头一部分进行查找。

存在索引但不能使用索引的典型场景

  • 以%开头的LIKE查询不能够利用B-Tree索引,执行计划中key的值为NULL表示没有只用索引。解决方式有两种:一是采用全文索引。二是使用InnoDB的表是聚簇表的特点,采用轻量级的解决方式,也就是扫描索引(因为索引比表小)获得相应的主键,再根据主键回表检索记录,这样就可以避开全表扫描的大量IO请求。
  • 数据类型出现隐式转换的时候也不会使用索引,特别是当列类型是字符串,如果不加引号,即便这个列上有索引,也不会被用到。
  • 复合索引的情况下,假如查询条件不包含索引列最左边部分,则不会使用复合索引。
  • 使用索引比全表更慢,则不使用索引。
  • 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

查看索引使用情况
show status like ‘Handler_read%’;
如果索引正在工作,Handler_read_key的值将很高,这个值代表一个行被索引值读的次数,很低的值表明增加索引得到的性能改善不高,因为索引并不经常使用。
Handler_read_rnd_next的值高则意味着查询运行低效,并且应该建立索引补救。

0 0
原创粉丝点击