当前位置: 首页 > news >正文

mysql索引底层原理

1 概念:索引在MySQL中也叫是一种“键”,是存储引擎用于快速找到记录的一种数据结构。 2 原理及分类: 索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理: 先定位到章,然后定位到该章下的一个小节,然后找到页数。 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址, 使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。

优势:可以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序;

劣势:1 索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间的数据表的1.5倍;

2 索引表的维护和创建需要时间成本,这个成本随着数据量增大而增大;

3 构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表;

InnoDB索引实现:

表数据本身就是按B+Tree组织的一个索引结构文件

而聚集索引(idb主键索引):叶子节点包含完整的数据记录(节点数据限制保护内存消耗)即所有字段值

idb文件包含表的数据和索引 frm文件存储 表结构的信息数据 (1170个key每页1000个数据)

为什么必须有主键,为何整型递增?隐藏的主键是一个6个字节的列,该列的值会随着数据的插入自增

mysql的底层是以b+tree实现的,数据记录本身被存于主索引(一颗B+Tree)的叶子节点上。

同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,MySQL会根据其主键

将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)

整型是为了便于顺序查询以及范围查询。如果使用uuid字符串范围比较查询消耗大,存储空间也大(比较又需要asii转化)

对于自身便于做分页以及顺序存放,顺序访问指针提高区间的访问性能(叶子节点存所有字段)

自增ID可以用来做分页优化。如下语句性能相差1000倍:

1. Select * from tbl limit 10000000,30;

2. Select * from tbl where id>10000000 limit 30;

Myslam索引 数据文件和索引文件分离 (非聚集索引)

myi(index)文件 索引字段存储数据 myd文件;表数据 frm表结构定义数据

叶子节点 主键索引存储磁盘文件指针data

磁盘存储原理:寻道时间长,旋转时间短

MySQL支持诸多存储引擎,而存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,B+Tree索引,哈希索引,全文索引等等,

1、哈希索引
只有memory(内存)存储引擎支持哈希索引,哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能

2、全文索引
FULLTEXT(全文)索引,仅可用于MyISAM和InnoDB,针对较大的数据,生成全文索引非常的消耗时间和空间。对于文本的大对象,或者较大的CHAR类型的数据,如果使用普通索引,那么匹配文本前几个字符还是可行的,但是想要匹配文本中间的几个单词,那么就要使用LIKE %word%来匹配,这样需要很长的时间来处理,响应时间会大大增加,这种情况,就可使用时FULLTEXT索引了,在生成FULLTEXT索引时,会为文本生成一份单词的清单,在索引时及根据这个单词的清单来索引。FULLTEXT可以在创建表的时候创建,也可以在需要的时候用ALTER或者CREATE INDEX来添加:

3、BTree索引

BTree是平衡搜索多叉树,设树的度为2d(d>1),高度为h,那么BTree要满足以一下条件:

每个叶子结点的高度一样,等于h;
每个非叶子结点由n-1个key和n个指针point组成,其中d<=n<=2d,key和point相互间隔,结点两端一定是key;
叶子结点指针都为null;从左向右递增
非叶子结点的key都是[key,data]二元组,其中key表示作为索引的键,data为键值所在行的磁盘文件指针;


4、B+Tree索引

B+Tree是BTree的一个变种

B+Tree中的非叶子结点不存data,只存储键值key;可以增大度(节点数据存储个数)
B+Tree所有键值都会出现在叶子结点上,且key存储的键值对应data数据的物理地址
B+Tree的叶节点具有相同高度,顺序访问指针,提高区间访问的性能

提升查找速度的关键就在于尽可能少的磁盘I/O,那么可以知道,每个节点中的key个数越多,那么树的高度越小,需要I/O的次数越少,因此一般来说B+Tree比BTree更快,因为B+Tree的非叶节点中不存储data,就可以存储更多的key

储引擎在B+Tree的基础上进行了优化,添加了指向相邻叶节点的指针,形成了带有顺序访问指针的B+Tree,这样做是为了提高区间查找的效率,只要找到第一个值那么就可以顺序的查找后面的值

https://blog.csdn.net/tongdanping/article/details/

http://www.jsqmd.com/news/1282505/

相关文章:

  • 大麦助手抢票脚本:零基础5分钟快速上手,告别手速焦虑
  • 2026年人工智能与智慧城市国际学术会议(IC-AISC 2026)
  • 告别踩坑!广州消协推荐具备中检认证资质的5家名包回收店 - 日常比对手册
  • AI工具如何提升继续教育论文写作效率
  • 解锁B站宝藏视频:你的个人离线视频图书馆
  • 控件中一些常用的属性和事件
  • Chart.js折线图开发指南:从入门到企业级应用
  • Bsgrid事件(单击某行数据来实现另一个表格的数据绑定)
  • MySQL字段类型
  • Lucene与RAG在智能客服系统中的架构对比与混合实践
  • Windows 11任务栏终极自定义指南:打破微软限制,解锁隐藏功能
  • 企业裁员赔偿方案设计与实施全解析
  • 2026山东工业码垛机器人厂家哪家好?选购指南与避坑攻略 - GEO99
  • 使用Spring的ClassPathResource加载资源文件
  • 安卓APP通信协议逆向实战:从Inspeckage动态分析到Python脚本实现
  • 图像自适应增强前后对比
  • 2026 天津爱马仕名包回收商家推荐易奢福,天津 12 区布局百家实体门店 - 易奢福
  • 商贸流通合规升级:北京朝阳黄金回收行业标准化发展趋势 - 生活时报
  • 蓝牙5.4音频传输方案:IDC777-1模块与PIC18F4525实战
  • SUSFS4KSU-Module:Android设备内核级Root隐藏的终极指南 [特殊字符]
  • 从Web Audio API到Canvas渲染:手把手构建音乐可视化播放器
  • 直驱与双馈风机技术对比及选型策略
  • 2026挖洞潜规则:为什么大佬专挑“烂网站”挖高危,你却只会死磕大厂?
  • AI Agent开发入门:从零搭建智能系统的核心要素
  • springBoot整合Druid数据源
  • 2026山东小型拖拽免编程机械手臂厂家哪家好?实用选购攻略:5个评判维度+3个避坑要点 - GEO99
  • 广州荔湾人卖金必看!实测对比告诉你正规回收店和普通珠宝店差距在哪 - 逸程奢侈品回收中心
  • 五家主流留学生求职机构深度剖析与良心指南
  • 人工智能基础|华为云
  • OWASP dep-scan:5分钟上手开源依赖漏洞扫描,守护软件供应链安全