索引

本文深入探讨了MySQL中InnoDB存储引擎的索引原理及其实现方式,包括B+树结构的优势、聚集索引的特点以及为何推荐使用整型自增主键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

索引数据结构

  • 二叉树,容易退化成链表
  • 红黑树,数据量很大的时候,高度太高不适合
  • Hash表,映射,但范围查找(例如>20)效果差,只适合等值查找
  • B-Tree,树的高度控制在很小数值,叶子无双向指针,范围查找效果差;非叶子结点存储data,一层(固定16KB)只能放16个索引
  • B+Tree,MySQL索引底层数据结构。
    • 非叶子结点不存储data,只存储索引(冗余),一层(固定16KB)里可以放更多索引,1077个。即非叶子结点存放的索引越多,叶子结点存放的数据也越多
    • 叶子结点包含所有索引字段
    • 叶子结点用指针连接,可以找到前后结点的位置,提高区间访问能力,范围查找(例如>20)效果好,先定位到20,根据递增规则,依次把后面元素取出来
      在这里插入图片描述

一个索引大小16KB

MyISAM

在这里插入图片描述MyISAM存储引擎Data

MyISAM存储引擎IndexMYD存储数据
MYI存储索引,底层是B+树
在这里插入图片描述

InnoDB索引实现

  • 表数据文件本身就是按B+Tree组织的一个索引结构文件
  • 聚集索引-叶节点包含了完整的数据记录
  • InnoDB表必须有主键,并且推荐使用整型的自增主键?(面试)

在这里插入图片描述
在这里插入图片描述frm定义了表结构的信息
ibd

聚集索引

非聚集:索引和数据放在两个文件 ,例如MyISAM
聚集:索引和数据放在同个文件,例如InnoDB
速度上聚集索引快。

为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?(面试)

  • 如果不创建主键,MySQL会在表里面寻找唯一字段,如果找不到的话,还要自己创建一条链,来保证字段是唯一的,这条字段作为索引的主键。加大MySQL压力。
  • 整型?整型,方便比大小,字符串等类型比整型要慢多了。而且8字节,可以节省磁盘空间,一页可以存更多行记录。
  • 自增?不使用自增,会插入中间结点,导致B+Tree分裂,需要调整平衡,效率变低。

在这里插入图片描述

插入的时候

1.第一页先复制
2.原第二页改成目录页
在这里插入图片描述在这里插入图片描述这样做的好处是起始页永远不变,可以一直在缓存里,方便查询。

单值索引,联合索引
联合索引,先比较第一字段的值 ,如果一样,再比较第二字段的值
在这里插入图片描述
联合索引(b,c,d),索引是111,存储的值是主键1
在这里插入图片描述在这里插入图片描述a字段是主键,会作为辅助索引,对查询有帮助

最左前缀原则:
在这里插入图片描述
只有第一句才能使用联合索引,二三句都不可以。
在这里插入图片描述
跳过name,直接查age ,age是不会排好序的。意味着需要一直往后找,每个都有可能是30.
但是如果是在name相同的情况下,那么age是排好序的。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值