索引那些事


title: 索引那些事
categories: MySQL


一、B+Tree索引、B-Tree索引、哈希索引

1. B-Tree索引

B-Tree索引,利用树形结构,同时又不同于二叉树,二叉树每个结点只能有两个结点,数据量大时会造成树的层级过高,导致搜索速度变慢,而B树采用的是多子节点树(非多叉树),使的树的层级减少。但对于范围查询仍有一些缺陷,每个节点都保存数据,因而但范围查询时需返回遍历节点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qj1abgMx-1585321647386)(https://s1.ax1x.com/2020/03/27/GiIR0A.png)]

2. B+Tree索引

B+Tree索引采用B+树的数据结构进行索引组织,在B树的基础上,将所有数据保存到叶子节点,非叶子节点仅保存索引,同时相连叶子节点之间采用指针相连接,大大提高了范围查询的速度,减少了随机IO

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0f0WVLC-1585321647394)(https://s1.ax1x.com/2020/03/27/Gi5dG8.png)]

3. hash索引

哈希索引基于哈希表实现,但索引必须精确匹配才能准确定位到数据位置,适合精准查询,不适合组合索引、范围查询等

二、聚簇索引和主键索引

聚簇索引和主键索引并不是相同的概念,大家不要搞混了,聚簇索引是指数据的组织方式,而主键索引就是一个唯一索引。只不过Innodb通过主键聚集数据,而MyISAM是不支持聚簇索引的

1. Inndb和MyISAM的数据组织
1. Innodb

Innodb采用聚簇索引,数据保存在聚簇索引的叶子节点上,而非聚簇索引的叶子节点则保存了数据的行号(及对应的聚簇索引的数据行位置)

2. MyISAM

MyISAM没有采用聚簇索引,他的所有索引的叶子节点都保存了一个指向数据行的指针

2. 聚簇索引的好坏
  1. 由于辅助索引保存的是行号而不是指针,所以当行发生移动或者页分裂时,无需修改辅助索引的节点值,而非聚簇索引则需要去修改所有索引中只想该行的指针
  2. 当发生范围查询的时候,采用聚簇索引可以更快的获得数据
  3. 当聚簇索引为顺序时,数据插入则从不断后面从后面插入,不会导致之前数据的位置发生变化
  4. 若聚簇索引值为随机时,可能会导致插入时造成更多的页分裂,以及范围查询速度缓慢

三、组合索引和索引覆盖

1. 组合索引

组合索引就是将多个列按一定顺序组合起来作为一个索引,而不是将多个单列索引组合起来

1. 优点
  1. 好的组合索引会提高选择度,提高筛选数据的效率
  2. 索引覆盖可以减少回表的次数从而减少IO次数,提高速率
  3. 使用组合索引排序可以避免部分文件排序,操作内存及资源的浪费
2. 注意事项
  1. 最左匹配

    使用组合索引的时候并非要把组合索引中的列全部使用到,但是不管如何,使用组合索引一定要按照索引定义的顺序进行使用,否则会导致索引失效,造成全表扫描

  2. 索引排序

    使用***order by***子句对所选数据进行排序时,若使用组合索引,也许遵守最左匹配原则,同时避免一个使用升序一个使用倒序的情况,这也会使得索引排序失效,导致文件排序

2. 索引覆盖

索引覆盖类似聚簇索引的功能,只不过索引覆盖是将查询数据保存在索引中,如

key(name,father)

select father from user where name = “aaa”

这样的sql就会使用到索引覆盖技术,而无需回表查询整行数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值