索引的详解

1.何为索引?有什么作用?

  1. 索引是一种用于快速查询和检索数据的数据结构。索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。

2.索引的优缺点
优点——使用索引可以大大加快 数据的检索速度(大大减少检索的数据量)性。降低数据库的IO成本。
缺点——创建索引和维护索引需要耗费许多时间。当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改+索引需要使用物理文件存储,也会耗费一定空间。

3.索引的类型
主键索引+二级索引(起辅助的作用)(包括以下四个)

  1. 1.唯一索引(Unique Key) :唯一索引也是一种约束。唯一索引的属性列不能出现重复的数据,但是允许数据为 NULL,一张表允许创建多个唯一索引。 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
    2.普通索引(Index) :普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。
    3.前缀索引(Prefix) :前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符。
    4.全文索引(Full Text) :全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。

4.索引的底层数据结构*
哈希表和B+树
1.原理——哈希表是键值对的集合,通过键(key)即可快速取出对应的值(value),因此哈希表可以快速检索数据

缺点——Hash 索引不支持顺序和范围查询

2.B+树

实则为多路平衡查找树

B 树& B+树两者有何异同呢?

  1. 树的所有节点既存放键(key) 也存放 数据(data),而 B+树只有叶子节点存放 key 和 data
  2. B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。在这里插入图片描述
    B+树可以保证等值和范围查询的快速查找

聚集索引与非聚集索引
聚集索引
聚集索引即索引结构和数据一起存放的索引数据表的主键列使用的就是主键索引主键索引属于聚集索引

在 Mysql 中,InnoDB 引擎的表的 .ibd文件就包含了该表的索引和数据,对于 InnoDB 引擎表来说,该表的索引(B+树)的每个非叶子节点存储索引,**叶子节点存储索引和索引对应的数据**。

非聚集索引
非聚集索引即索引结构和数据分开存放的索引。二级索引属于非聚集索引

每个叶子非叶子节点存储索引, 叶子节点存储索引和索引对应数据的指针

在这里插入图片描述
很好地说明了问题

索引具体实现
使用B+树构建索引树时,叶子节点中存储的键值为索引列的值,数据为索引所在行的磁盘地址。
在这里插入图片描述
根据主键等值查询数据:

select * from user where id = 28;

具体的过程
在这里插入图片描述
聚集索引与非聚集索引

主键索引的叶子节点会存储数据行,辅助索引只会存储主键值,再根据主键值获取整行的数据。

在这里插入图片描述
在这里插入图片描述
辅助索引

以表user_innodb的age列为例,age索引的索引结果如下图。(这里也可以说明辅助索引的作用就是帮助找到主键的)
在这里插入图片描述
在这里插入图片描述
根据在辅助索引树中获取的主键id,到主键索引树检索数据的过程称为回表查询。

[最左匹配原则:](看这里)
出现的背景——再组合索引中

例如,建的idx_abc(a,b,c)索引,相当于创建了(a)、(a,b)(a,b,c)三个索引。

使用组合索引查询时,mysql会一直向右匹配(先比较a列来确定下一步应该搜索的方向,往左还是往右。如果a列相同再比较b列。b列相同再比较c列)直至遇到范围查询(>、<、between、like)就停止匹配。

覆盖索引
如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为“覆盖索引”。
例如 select a,b,c from table 选中了abc这三个字段,而他们恰巧是组合索引idx_abc(a,b,c),则就是这个索引就是覆盖索引了

PS;被频繁更新的字段应该慎重建立索引。
尽可能的考虑建立联合索引而不是单列索引。
注意避免冗余索引

虽然索引能带来查询上的效率,但是维护索引的成本也是不小的。 如果一个字段不被经常查询,反而被经常修改,那么就更不应该在这种字段上建立索引了。

此外

  1. 对于组合索引,where条件如果只包含组合索引的个别字段时,必须是从前往后,否则查询语句不会走索引。比如有一个组合索引是订单ID+用户ID,如果以用户ID为查询条件,无法使用这个索引;而用订单ID查询,可以使用该索引,这是索引的存储数据结构决定的。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值