您的位置:首页 > 数据库

SQL优化--索引

2016-05-10 14:06 309 查看
MYSQL目前支持4种索引:

B-Tree索引:最常见的索引类型,大部分引擎都支持B树索引。

Hash索引:只有Memory引擎支持,使用场景简单。

R-Tree索引(空间索引) :空间索引是MyISAM的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少。

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的值高则意味着查询运行低效,并且应该建立索引补救。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: