首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql之索引结构 (地铁小笔记)

mysql之索引结构 (地铁小笔记)

作者头像
用户2825413
发布2019-07-19 16:05:50
5410
发布2019-07-19 16:05:50
举报

哎呀, 好久都没更新文章了,密码都要忘了…

以后尽量努力要隔两天发一篇日常骚扰文?。

mysql索引结构

1. 哈希

哈希表这种结构适用于只有等值查询的场景. 对于区间类查询将会悲剧。

2. 有序数组

有序数组在等值查询和范围查询场景中的性能就都非常优秀 , 但是如果插入 删除操作成本高,适合数据不变化或只新增.

3 .树类结构之 二叉树

搜索效率最高,但是相应树的高度高。导致读磁盘数据块次数多,降低性能

从降低磁盘次数提高性能优化可以使用如下操作: 降低树的高度, 形成n叉树, 父节点可以全部缓存到内存。

innodb的默认索引结构

我们mysql数据库经常使用的为 b+ 树, 每一个索引对应一个 b+ 树。

B+树每个节点可以有多个值, 这样可以降低树的高度,有效减少磁盘的读取次数. 所有叶子节点拥有链指针,对于区间查询更加方便快速。

按存储形式区分索引

主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引 (clustered index)

非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引 (secondary index)

基于主键索引和基于普通索引区别

基于主键索引只需要扫描一次树即可, 而基于普通索引扫描到主键, 再回表扫描主键索引。

回表的意思这里表示查询一次树,再根据主键扫面主键B+索引。

(图片来源网络)

B+树的索引维护

当然也有问题, 当你插入、删除的大量节点数据为无序型数据时, 会造成频繁的页分裂、索引维护问题, 产生空间碎片, 可能会导致性能下降。

所以为什么我们尽量采用主键为整型的递增顺序呢?

1. 页分裂

如果叶子节点保存了 200 400 500,此时插入300,会将400 500空出之前的位置,加入300。

如果此时此数据页已满, 则根据b+树, 会重新申请数据页, 此为页分裂。

2. 页合并

当然有分裂就有合并。当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程。

3. 选择主键的讲究

显然,主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。所以我们一般推荐 int(4字节) 或 bigint(8字节) 来作为主键,占用空间最小, 并且有序。

同样降低索引的大小对于基于此索引的 B+ 树扫描,同样有益。

B树家族之 B B+ B- 树介绍:

https://blog.csdn.net/u013411246/article/details/81088914

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 呆呆熊的技术路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • mysql索引结构
    • 1. 哈希
      • 2. 有序数组
        • 3 .树类结构之 二叉树
        • innodb的默认索引结构
          • 按存储形式区分索引
            • 基于主键索引和基于普通索引区别
              • B+树的索引维护
                • 1. 页分裂
                • 2. 页合并
                • 3. 选择主键的讲究
            相关产品与服务
            云数据库 SQL Server
            腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档