0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

对 B+ 树与索引在 MySQL 中的认识

数据分析与开发 来源:博客园 作者:AnnsShadoW 2021-11-08 11:11 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

本质:数据库维护某种数据结构以某种方式引用(指向)数据

索引取舍原则:索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数

B树

满足的条件

d为大于1的一个正整数,称为B-Tree的度

h为一个正整数,称为B-Tree的高度

每个非叶子节点由n-1个key和n个指针组成,其中d《=n《=2d

每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null

所有叶节点具有相同的深度,等于树高h

key和指针互相间隔,节点两端是指针

一个节点中的key从左到右非递减排列

所有节点组成树结构

每个指针要么为null,要么指向另外一个节点

一个度为d的B-Tree,设其索引N个key,则其树高h的上限为logd((N+1)/2),检索一个key查找节点的个数的渐进复杂度为logd(N)

更新后的操作

插入删除新的数据记录会破坏B-Tree的性质,因此在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质

B+树

bb7b4ebc-3fc2-11ec-9195-dac502259ad0.jpg

每个节点的指针上限为2d而不是2d+1

内节点不存储data,只存储key

叶子节点不存储指针

在经典B+树的基础上,增加了顺序访问指针--》提高区间访问的性能

为什么使用B/B+树?

主存读取

当系统需要读取主存时,则将地址信号放到地址总线上传给主存

主存读到地址信号后,解析信号并定位到指定存储单元,然后将此存储单元数据放到数据总线上,供其它部件读取

主存存取的时间仅与存取次数呈线性关系,因为不存在机械操作,两次存取的数据的“距离”不会对时间有任何影响

磁盘存取原理

磁盘转动,每个磁头不动,负责读取内容

不过已经有了多磁头独立技术

局部性原理

磁盘预读:长度一般以页的整数倍为单位

MyISAM索引实现

使用B+树作为索引结构,data存放数据记录的地址

索引文件与数据文件分离

主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复

非聚集:MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录

.MYI文件的组成

整个索引文件的基本信息state

各索引的限制信息base

各索引的定义信息keydef

各索引记录的概要信息recinfo

读取索引的流程

query请求,直接读取key cache中的cache block,有就返回

没有就到.MYI文件中以file block方式读取数据

再以相同的格式存取key cache

再将key cache中的数据返回

InnoDB索引实现

也是使用B+树

第一个与MyISAM的不同点

第一个重大区别是InnoDB的数据文件本身就是索引文件,表数据文件本身就是按B+Tree组织的一个索引结构

InnoDB的数据文件本身要按主键聚集

所以InnoDB要求表必须有主键(MyISAM可以没有)

没有显式指定,自动选择唯一标识列

不存在的话,生成6个字节长整型的隐含字段

第二个与MyISAM的不同点

InnoDB的辅助索引data域存储相应记录主键的值而不是地址

换句话说,InnoDB的所有辅助索引都引用主键作为data域

辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录

得出的优化点

不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大

用非单调的字段作为主键在InnoDB中也不好,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键就很不错了

聚簇索引键被更新造成的成本除了索引数据可能会移动,相关的所有记录数据也要移动

索引使用策略及优化

全列匹配

按照索引中所有列进行精确匹配(这里精确匹配指“=”或“IN”匹配)时,索引可以被用到

理论上索引对顺序是敏感的,但是由于MySQL的查询优化器会自动调整where子句的条件顺序以使用适合的索引

最左前缀匹配

当查询条件精确匹配索引的左边连续一个或几个列时,索引可以被用到

查询条件用到了索引中列的精确匹配,但是中间某个条件未提供

只能用到索引中,从中间断开前的列

应对

可以增加辅助索引

当中间条件选项较少时,用隔离列的方式,使用IN包含

看情况,比较建立

查询条件没有指定索引第一列

不满足使用索引的条件

匹配某列的前缀字符串

可以使用索引

如果通配符%不出现在开头,则可以用到索引,但根据具体情况不同可能只会用其中一个前缀

范围查询

范围列可以用到索引(必须是最左前缀),但是范围列后面的列无法用到索引

同时,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引

仅用explain可能无法区分范围索引和多值匹配

查询条件中含有函数/表达式

一般不使用哦

手工算好再代入

索引选择性与前缀索引

MyISAM与InnoDB基数统计方式

MyisAM索引的基数值(Cardinality,show index 命令可以看见)是精确的,InnoDB则是估计值

MyisAM统计信息是保存磁盘中,在alter表或Analyze table操作更新此信息

而InnoDB则是在表第一次打开的时候估计值保存在缓存区内

不建议建立索引的情况

表记录比较少

索引的选择性低:不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值

前缀索引

用列的前缀代替整个列作为索引key,当前缀长度合适时,可以做到既使得前缀索引的选择性接近全列索引,同时因为索引key变短而减少了索引文件的大小和维护开销

缺点

不能用于ORDER BY和GROUP BY操作

也不能用于Covering index(即当索引本身包含查询所需全部数据时,不再访问数据文件本身)

InnoDB主键选择与插入优化

如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键

InnoDB使用聚集索引,数据记录本身被存于主索引(一颗B+Tree)的叶子节点上

这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)

如果使用非自增主键,每次插入近似随机,容易引起数据的移动,重新读目标页面,碎片也多了,虽然也可以用OPTIMIZE TABLE重建优化,但麻烦啊

参考资料

图片来源网络

《高性能MySQL》

作者:AnnsShadoW

https://www.cnblogs.com/annsshadow/p/5355090.html

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 磁盘
    +关注

    关注

    1

    文章

    401

    浏览量

    26586
  • 数据库
    +关注

    关注

    7

    文章

    4078

    浏览量

    68524
  • MySQL
    +关注

    关注

    1

    文章

    928

    浏览量

    29739

原文标题:对 B+ 树与索引在 MySQL 中的认识

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    坤维科技完成B+轮融资,领跑人形机器人“力控感知”新赛道

    2026年,人形机器人产业正站在规模化商业化的“破晓时刻”。在这一关键节点,国内六维力传感器领域的领军企业——坤维(北京)科技有限公司(以下简称“坤维科技”)宣布完成1亿元人民币的B+轮融资。本轮
    的头像 发表于 03-26 19:48 2026次阅读
    坤维科技完成<b class='flag-5'>B+</b>轮融资,领跑人形机器人“力控感知”新赛道

    发电机B+、D+、W、N端子接什么线

    发电机接线B+、D+、W、N端子是常见的标识,正确连接这些端子对发电机的正常运行至关重要。以下将详细解析各端子的功能及接线方法,并结合实际应用场景提供操作建议。
    的头像 发表于 03-13 17:17 1117次阅读

    MySQL慢查询分析与索引调优全流程

    MySQL 性能问题在生产环境的表现通常是渐进式的:业务量增长、数据量膨胀,某天突然发现 P99 响应时间从 50ms 涨到 2s。慢查询是最常见的根因,而索引设计不合理又是慢查询的主要来源。
    的头像 发表于 03-06 15:56 233次阅读

    润芯微科技完成近4亿元B+轮融资

    1月29日,国产智能基座方案提供商润芯微科技(RIVOTEK)正式宣布完成近4亿元B+轮融资。本轮融资由重庆长嘉纵横私募股权投资基金、恒旭资本、江苏省战新基金、苏州高铁新城国控等多家国资及产业资本
    的头像 发表于 01-29 16:15 425次阅读

    无线倾角传感器监测的应用:以科技守护活文物的结构安全

    无线倾角传感器监测的应用:以科技守护活文物的结构安全
    的头像 发表于 01-09 11:38 760次阅读
    无线倾角传感器<b class='flag-5'>在</b>古<b class='flag-5'>树</b>监测<b class='flag-5'>中</b>的应用:以科技守护活文物的结构安全

    工业数据台支持接入MySQL数据库吗

    工业数据台完全支持接入MySQL数据库 ,且通过数据同步、集成与治理等技术手段,能够充分发挥MySQL在数据存储与事务处理方面的优势,同时弥补其在数据分析与共享能力上的不足,具体分析如下: 技术
    的头像 发表于 12-04 11:23 495次阅读
    工业数据<b class='flag-5'>中</b>台支持接入<b class='flag-5'>MySQL</b>数据库吗

    Hudi系列:Hudi核心概念之索引(Indexs)

    上的Instant action操作类型 ▪1.4 时间线上State状态类型 ▪1.5 时间线官网实例 ◦二. 文件布局 ◦三. 索引 3.1 简介 3.2 对比其它(Hive)没有索引的区别 3.2
    的头像 发表于 10-21 09:47 513次阅读
    Hudi系列:Hudi核心概念之<b class='flag-5'>索引</b>(Indexs)

    先楫半导体完成B+轮融资,移和创投资加持

    2025年9月10日,上海|国产高性能MCU产品及嵌入式解决方案供应商“上海先楫半导体科技有限公司”(先楫半导体,HPMicro)完成B+轮战略融资,获中国移动旗下移和创投资加持,投资方还包括浦东
    的头像 发表于 09-11 08:32 1596次阅读
    先楫半导体完成<b class='flag-5'>B+</b>轮融资,<b class='flag-5'>中</b>移和创投资加持

    宜科MVT阀岛科技人形机器人中的应用

    科技飞速发展的当下,机器人行业正以前所未有的速度蓬勃兴起。其中,宇科技作为行业内的佼佼者,凭借其创新的产品和领先的技术,全球机器人市场占据了重要地位。从四足机器人到人形机器人,
    的头像 发表于 08-16 17:31 1602次阅读

    MySQL慢查询终极优化指南

    作为一名在生产环境摸爬滚打多年的运维工程师,我见过太多因为慢查询导致的线上故障。今天分享一套经过实战检验的MySQL慢查询分析与索引优化方法论,帮你彻底解决数据库性能瓶颈。
    的头像 发表于 08-13 15:55 941次阅读

    2.88亿!滤波器明星企业新声半导体完成B+轮融资

    据传感器专家网获悉,近日,滤波器明星企业新声半导体宣布已完成2.88亿元B+轮融资,本轮融资由洪泰基金领投,其他投资方包括泓生资本、滕华投资、中山金控、合肥市建投集团及滨湖金投集团。 值得一提的是
    的头像 发表于 08-12 19:16 1576次阅读
    2.88亿!滤波器明星企业新声半导体完成<b class='flag-5'>B+</b>轮融资

    MySQL 8.0性能优化实战指南

    作为一名运维工程师,MySQL数据库优化是我们日常工作中最具挑战性的任务之一。MySQL 8.0作为当前主流版本,性能、安全性和功能上都有了显著提升,但如何充分发挥其潜力,仍需要我们掌握正确的优化策略。
    的头像 发表于 07-24 11:48 1029次阅读

    企业级MySQL数据库管理指南

    在当今数字化时代,MySQL作为全球最受欢迎的开源关系型数据库,承载着企业核心业务数据的存储与处理。作为数据库管理员(DBA),掌握MySQL的企业级部署、优化、维护技能至关重要。本文将从实战角度出发,系统阐述MySQL
    的头像 发表于 07-09 09:50 868次阅读

    介绍三种常见的MySQL高可用方案

    方案——MHA(MySQL High Availability Manager)、PXC(Percona XtraDB Cluster) 和 Galera Cluster。我们将从原理、架构、优势和局限性等角度对比这三种方案,并探讨它们实际应用
    的头像 发表于 05-28 17:16 1427次阅读

    北大教授领衔,无锡一传感器公司完成B+轮数千万元融资

    近日,北微传感科技有限公司(下文简称“北微传感”)宣布,已完成数千万B+轮融资。本轮投资方尚未公布。
    的头像 发表于 05-13 10:36 810次阅读