Mysql索引结构

在 MySQL 中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论 MyISAM 和 InnoDB 两个存储引擎的索引实现方式。

MyISAM 索引实现
MyISAM 引擎使用 B+Tree 作为索引结构,叶节点的 data 域存放的是数据记录的地址。下图是 MyISAM 索引的原理图:
在这里插入图片描述

这里设表一共有三列,假设我们以 Col1 为主键,则图 8 是一个 MyISAM 表的主索引(Primary key)示意。可以看出 MyISAM 的索引文件仅仅保存数据记录的地址。

在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是唯一的,而辅助索引的 key 可以重复。如果我们在 Col2 上建立一个辅助索引,则此索引的结构如下图所示

同样也是一颗 B+Tree,data 域保存数据记录的地址。因此,MyISAM 中索引检索的算法为首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其data 域的值,然后以 data 域的值为地址,读取相应数据记录。

InnoDB 索引实现 (B+Tree 作为索引结构)
1、非叶子节点不存储data 只存储索引 可以放更多的索引
2、并且每个索引后面都会跟有一个指向下一页的指针,提高区间访问的性能
3、叶子节点包含所有索引字段
*

** innodb只会有一个聚集索引 如果建立了主键 主键就是聚集索引
叶节点包含了完整的数据记录 也就是索引所在行的整行数据**

首先我们来看下一颗层高为3的b+树可以存放多少条数据
mysql页默认大小16k,如果数据行大小1k,叶子节点存放的完整数据,则叶子节点一页可以放16条数据;非叶子节点页面存放的是主键和指针,所以主要看主键是啥类型,假设是long,则长度8字节,指针大小在innodb是6字节,一共14字节,所以非叶子节点每页可以存16384/14=1170个主键数据(1170个分叉),则三层b+树数据可以存1170117016=21902400条数据。(千万级别)

首先我们要认识到索引是排好序的

主键索引:
在这里插入图片描述在这里插入图片描述

上图是 InnoDB 主键索引(同时也是数据文件)的示意图,叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为 InnoDB 的数据文件本身要按主键聚集

InnoDB 要求表必须有主键(MyISAM 可以没有),若未建立主键 数据库选择所有数据不相同的列建立b+tree 如果所有列都不符合 那么mysql会建立一个隐藏列来维护数据(rowid)

尽量在 InnoDB 上采用自增字段做表的主键
首先整型的大小容易比较 uuid需要通过asc码逐一比较 整型的索引占用空间比较小
若使用非自增 后续插入可能在已放满的索引页里新增数据 会造成索引页分页 还有就是非页子节点索引的一个重新平衡 消耗性能。
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页

辅助索引:
在这里插入图片描述
辅助索引 data 域存储相应记录主键的值而不是地址。换句话说,InnoDB 的所有辅助索引都引用主键作为 data 域。
所以非主键索引要做一次回表操作 通过获取到的主键再去定位一遍

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值