数据库--索引数据结构

1 为什么使用索引

索引: 它是存储引擎用于快速找到数据记录的一种数据结构。
创建索引的目的:为了减少磁盘I/O的次数,加快查询效率

2. 索引的推演

B+树都不会超过4层
树的层次越低,IO次数就越少。
默认数据页大小是16kb

3. 常见索引

3.1 聚簇索引

它并不是一种单独的索引类型,而是一种数据存储方式(所有用户记录都存储在了叶子节点)
也就是:索引即数据
数据页和数据页之间是双向链表结构
数据页中存储的数据之间是单向链表结构

特点:

  1. 页内 的记录是按照主键的大小顺序排成一个 单向链表
  2. 各个存放 用户记录的页 也是根据页中用户记录的主键大小顺序排成一个 双向链表 。
  3. 存放 目录项记录的页 分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键
    大小顺序排成一个 双向链表 。

B+树的 叶子节点 存储的是完整的用户记录。
所谓完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列)。

优点:

  1. 数据访问更快 ,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快
  2. 聚簇索引对于主键的 排序查找范围查找 速度非常快。
  3. 按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库不用从多个数据块中提取数据,所以 节省了大量的io操作

缺点:
4. 插入速度严重依赖于插入顺序 ,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影
响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
5. 更新主键的代价很高 ,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为
不可更新

限制:
6. 如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引

3.2联合索引

联合索引是非聚簇索引中的一种

3.3 非聚簇索引

什么是回表?
在这里插入图片描述
如果我们想查询c2:4的记录信息
select c1,c2,c3 from xx表
但是此时表中只含有c1,c2信息,没有C3信息,所以只能拿到该c2对应的c1主键信息,

3.4 InnoDB的B+树索引的注意事项

  1. 根页面位置万年不动: 始终保持不动,会进行复制操作,并改变自身的状态。
  2. 内节点(非叶子节点)中目录项记录的唯一性: 针对非聚簇索引
    二级索引在内节点中也包含主键值
    注意:在生成聚簇索引时,是先有根节点的。自上而下。
  3. 一个页面最少存储2条记录

4. MyISAM中的索引方案

在这里插入图片描述
即使多个存储引擎支持同一种类型的索引,但是他们的实现原理也是不同的。Innodb和MyISAM默认的索
引是Btree索引;而Memory默认的索引是Hash索引。
MyISAM引擎使用 B+Tree 作为索引结构,叶子节点的data域存放的是 数据记录的地址

4.2 MyISAM索引的原理

数据和索引是分离的。 都是二级索引(非聚簇索引),无聚簇索引。

5 InnoDB 与 MyISM区别

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值