admin 管理员组

文章数量: 887021

索引

什么是索引:

        索引是作用于列上,为该列的数据形成目录,从而提高该列数据的查询效率.索引通常作用于数据量大的表中。

索引形成目录的原理 - B+Tree

        索引的数据结构为B+Tree,该数据结构可以将数据形成目录

BTree

BTree对所有元素进行了排序,是一颗度可以自定义的树,
每个节点位置保存的是一个数据块,而不是每个元素.
定义好度n后,则每个数据块中最多可以保存n-1个元素,
当数据块中的元素数量达到n,此时这个数据块会进行分裂提取,
将最中间元素进行提取,提取到上一级数据块中,
中间元素两侧分裂成2个数据块,依然存在于这一层中.好处:数据量大的数据形成BTree,查询找查询次数会降低,从而提高查询效率.

B+Tree是在BTree基础上扩展而来的

B+Tree是基于BTree扩展而来的,都实现了元素的排序,
和BTree一样都会进行分裂提取,度设置好后,
每个数据快中保存的最大元素数量也确定,
为n-1,当数据块中的元素数量达到n,此时进行分裂提取B+Tree和BTree不同:1. 提取后的元素是否存在于原层级B+Tree若从叶子节点中提取元素,提取到上一级后,该元素依然存在于叶子节点中若从非叶子节点中提取元素,提取到升一级后,该元素不再存在于原来层级2. B+Tree中叶子节点的数据块之间有链表进行维护(有序的),好处是可以提高区间范围内数据查询的效率.eg:查询11-15之间所有的元素

索引分类

1. 聚集索引/主索引 -- 给主键添加的索引
2. 非聚集所用/辅助索引 -- 给非主键字段添加的索引

聚集索引:

mysql的存储引擎:
    从mysql5.x开始,存储引擎为Innodb,该存储引擎
        1. 支持事务和行锁
        2. 会自动给每张表的主键字段添加索引(聚集索引)
     注意点:Innodb存储引擎会自动会每张表的主键添加聚集索引,若表中没有主键,则自动为添加了unique约束的字段添加索引,若表中没有主键,没有唯一性约束,此时Innodb会自动为表添加一个主键,类型为long,长度为6,为该主键添加聚集索引

聚集索引构建B+Tree时的特点:

聚集索引的叶子节点中保存的元素均为key-value,其中key保存主键,value保存的是该主键对应的一行数据
    
根据主键查询数据时,可以很快的找到对应的行数据              例图

非聚集索引

添加给非主键字段的索引叫做非聚集索引
叶子节点的key-value
    key:添加了索引的字段的值
    value:主键
非聚集索引添加给某字段后,后期查询时,根据字段找到主键,再根据主键去聚集索引中查询对应的数据

 索引是如何提高查询效率的

1.构建树结构,可以大大降低对磁盘的IO操作(对磁盘进行IO操作时间级别为ms)
2.读取到数据块后,会将数据块缓存到内存中,之后对内存进行IO操作,来遍历元素从而进行大小判断,    也会提高查询效率(对内存的IO操作时间级别为ns)

索引的基本操作

创建索引:create index index_name  on table(col)
查询索引:show index  from table_name
删除索引:drop index index_name on table_name

索引的使用的注意点 - 什么时候使用索引,什么时候不能用索引

1. 当表中数据量大时,为了提高查询效率,应该使用索引,即表数据量小时,不应选择索引
2. 当某字段的值会被频繁修改时,不应该使用索引,因为值修改后会导致索引的重构;某些字段的值几乎是不变,或被修改的频率很低,此时这个字段就适合添加索引
3. 索引并不是随意添加给某个字段的,通常是给作为查询条件的字段添加索引的
4. 一个表的索引并不是越多越好.

索引的失效情况 -- 面试高频

1. 对添加了索引的字段进行运算,此时会放弃索引,执行全表扫描eg: select ..from ...where age+4>12
2. 对添加了索引的字段使用函数,此时会放弃索引,执行全表扫描eg: select ....sum(xx) from ...
3. 对添加了索引的字段使用左模糊查询,此时会放弃索引,执行全表扫描eg: select....from ..where xx like '%_xx'
4. 对添加了索引的字段使用not in,此时会放弃索引,执行全表扫描eg: select...from...where age not in(11,12,13) 

 

本文标签: 索引