MySQL性能调优——索引详解与索引的优化

Moltbot 超详细安装使用教程(初学者版) 你在外面逛街,用微信/Telegram 发消息说"帮我查一下明天的天气"它立刻帮你查好并回复你说"帮我在电脑上新建一个文件夹叫'工作文档'"它真的帮你在电脑上创建了这就是 Moltbot ——一个能真正帮你干活的 AI 助手。API Key 就像是一把"钥匙",让 Moltbot 能够使用 AI 服务。 阅读详情

——索引优化,可以说是数据库相关优化、理解尤其是查询优化中最常用的优化手段之一。所以,只有深入索引的实现原理、存储方式、不同索引间区别,才能设计或使用最优的索引,最大幅度的提升查询效率!


一、BTree索引

1、概述

Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持BTree索引。正是其优异的检索表现,才使其有这样的地位。

2、存储结构

正如其名,这类索引的物理文件大多就是以BTree结构来存储的,但会有不同的存储引擎在使用BTree索引时,对存储结构稍作修改,比如MyISAM存储引擎,使用B+Tree的数据结构,它相对与BTree结构,所有的数据都存放在叶子节点上,且把叶子节点通过指针连接到一起,形成了一条数据链表,以加快相邻数据的检索效率。

(对B树、B+树不熟悉的,可参看博客索引基础——B-Tree、B+Tree、红黑树、B*Tree数据结构 或《算法导论》)


另外,对于innoDB存储引擎,虽然同样使用B+Tree作为索引的存储结构,但具体实现却与MyISAM截然不同,这也是作为MyISAM与InnoDB存储引擎的一个重要区别反复被面试官问到。(关于MyISAM与InnoDB存储引擎可参看博客MySQL架构设计——MyISAM存储引擎与InnoDB存储引擎)


(1)MyISAM引擎索引结构的叶子节点的数据域,存放的并不是实际的数据记录,而是数据记录的地址。索引文件与数据文件分离,这样的索引称为“非聚簇索引”。MyISAM的主索引与辅助索引区别并不大,只是主键索引不能有重复的关键字。

如下图所示为非聚簇索引的主键索引:


其检索算法:先按照B+Tree的检索算法检索,找到指定关键字,则取出对应数据域的值,作为地址取出数据记录。

(2)InnoDB引擎索引结构的叶子节点的数据域,存放的就是实际的数据记录(对于主索引,此处会存放表中所有的数据记录;对于辅助索引此处会引用主键,检索的时候通过主键到主键索引中找到对应数据行),或者说,InnoDB的数据文件本身就是主键索引文件,这样的索引被称为“聚簇索引”,一个表只能有一个聚簇索引。

如下图所示为聚簇索引的主键索引:



二、Hash索引

1、概述及存储结构

主要就是通过Hash算法(常见的Hash算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式存储。

检索算法:在检索查询时,就再次对待查关键字再次执行相同的Hash算法,得到Hash值,到对应Hash表对应位置取出数据即可,如果发生Hash碰撞,则需要在取值时进行筛选。目前使用Hash索引的数据库并不多,主要有Memory等。

2、Hash索引的弊端

一般来说,索引的检索效率非常高,可以一次定位,不像B-Tree索引需要进行从根节点到叶节点的多次IO操作。有利必有弊,Hash算法在索引的应用也有很多弊端。

a、Hash索引仅仅能满足等值的查询,范围查询不保证结果正确。因为数据在经过Hash算法后,其大小关系就可能发生变化。

b、Hash索引不能被排序。同样是因为数据经过Hash算法后,大小关系就可能发生变化,排序是没有意义的。

c、Hash索引不能避免表数据的扫描。因为发生Hash碰撞时,仅仅比较Hash值是不够的,需要比较实际的值以判定是否符合要求。

d、Hash索引在发生大量Hash值相同的情况时性能不一定比B-Tree索引高。因为碰撞情况会导致多次的表数据的扫描,造成整体性能的低下,可以通过采用合适的Hash算法一定程度解决这个问题。

e、Hash索引不能使用部分索引键查询。因为当使用组合索引情况时,是把多个数据库列数据合并后再计算Hash值,所以对单独列数据计算Hash值是没有意义的。


三、Full-Text索引

1、概述

全文索引,目前MySQL中只有MyISAM存储引擎支持,并且只有CHAR、VARCHAR、TEXT类型支持。它用于替代效率较低的LIKE模糊匹配操作,而且可以通过多字段组合的全文索引一次性全模糊匹配多个字段。

2、存储结构

同样使用B-Tree存放索引数据,但使用的是特定的算法,将字段数据分割后再进行索引(一般每4个字节一次分割),索引文件存储的是分割前的索引字符串集合,与分割后的索引信息,对应Btree结构的节点存储的是分割后的词信息以及它在分割前的索引字符串集合中的位置。


四、索引利弊

1、索引的好处

a、提高数据检索的效率,降低检索过程中必须要读取得数据量,降低数据库IO成本。

b、降低数据库的排序成本。因为索引就是对字段数据进行排序后存储的,如果待排序的字段与索引键字段一致,就在取出数据后不用再次排序了,因为通过索引取得的数据已满足排序要求。另外,分组操作是先排序后分组,所以索引同样可以省略分组的排序操作,降低内存与CPU资源的消耗。

2、索引的弊端

a、索引会增加 增、删、改操作所带来的IO量与调整索引的计算量。

b、索引要占用空间,随着数据量的不断增大,索引还会带来存储空间的消耗。


五、判断是否应该建索引的条件

1、较频繁的作为查询条件的字段应该创建索引

2、唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件

3、增、删、改操作较多的数据库字段不适合建索引


附:计算机内存存取、磁盘存取原理:(转载自:张洋的博客园http://www.uml.org.cn/sjjm/201107145.asp)

主存存取原理

目前计算机使用的主存基本都是随机读写存储器(RAM),现代RAM的结构和存取原理比较复杂,这里本文抛却具体差别,抽象出一个十分简单的存取模型来说明RAM的工作原理。

image

图1

从抽象角度看,主存是一系列的存储单元组成的矩阵,每个存储单元存储固定大小的数据。每个存储单元有唯一的地址,现代主存的编址规则比较复杂,这里将其简化成一个二维地址:通过一个行地址和一个列地址可以唯一定位到一个存储单元。图5展示了一个4 x 4的主存模型。

主存的存取过程如下:

当系统需要读取主存时,则将地址信号放到地址总线上传给主存,主存读到地址信号后,解析信号并定位到指定存储单元,然后将此存储单元数据放到数据总线上,供其它部件读取。

写主存的过程类似,系统将要写入单元地址和数据分别放在地址总线和数据总线上,主存读取两个总线的内容,做相应的写操作。

这里可以看出,主存存取的时间仅与存取次数呈线性关系,因为不存在机械操作,两次存取的数据的“距离”不会对时间有任何影响,例如,先取A0再取A1和先取A0再取D3的时间消耗是一样的。

磁盘存取原理

上文说过,索引一般以文件形式存储在磁盘上,索引检索需要磁盘I/O操作。与主存不同,磁盘I/O存在机械运动耗费,因此磁盘I/O的时间消耗是巨大的。

图6是磁盘的整体结构示意图。

image

图2

一个磁盘由大小相同且同轴的圆形盘片组成,磁盘可以转动(各个磁盘必须同步转动)。在磁盘的一侧有磁头支架,磁头支架固定了一组磁头,每个磁头负责存取一个磁盘的内容。磁头不能转动,但是可以沿磁盘半径方向运动(实际是斜切向运动),每个磁头同一时刻也必须是同轴的,即从正上方向下看,所有磁头任何时候都是重叠的(不过目前已经有多磁头独立技术,可不受此限制)。

图7是磁盘结构的示意图。

image

图3

盘片被划分成一系列同心环,圆心是盘片中心,每个同心环叫做一个磁道,所有半径相同的磁道组成一个柱面。磁道被沿半径线划分成一个个小的段,每个段叫做一个扇区,每个扇区是磁盘的最小存储单元。为了简单起见,我们下面假设磁盘只有一个盘片和一个磁头。

当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。

局部性原理与磁盘预读

由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理:

当一个数据被用到时,其附近的数据也通常会马上被使用。

程序运行期间所需要的数据通常比较集中。

由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率。

预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。

B-/+Tree索引的性能分析

到这里终于可以分析B-/+Tree索引的性能了。

上文说过一般使用磁盘I/O次数评价索引结构的优劣。先从B-Tree分析,根据B-Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:

每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3)。

综上所述,用B-Tree作为索引结构效率是非常高的。

而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。

上文还说过,B+Tree更适合外存索引,原因和内节点出度d有关。从上面分析可以看到,d越大索引的性能越好,而出度的上限取决于节点内key和data的大小:

dmax = floor(pagesize / (keysize + datasize + pointsize)) (pagesize – dmax >= pointsize)

或

dmax = floor(pagesize / (keysize + datasize + pointsize)) - 1 (pagesize – dmax < pointsize)

floor表示向下取整。由于B+Tree内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能。

这一章从理论角度讨论了与索引相关的数据结构与算法问题,下一章将讨论B+Tree是如何具体实现为MySQL中索引,同时将结合MyISAM和InnDB存储引擎介绍非聚集索引和聚集索引两种不同的索引实现形式。


手把手教你用yt-dlp批量下载YouTube视频数据集(附TikTok/Kaggle资源) 本文提供了一份构建视频数据集的实战指南,重点介绍了使用yt-dlp工具批量下载YouTube视频的高级技巧,包括环境配置、批量参数设置与自动化脚本。同时,文章还整合了TikTok、Kaggle及学术开源数据集等多源高质量视频资源,并分享了数据清洗、格式统一与管理的完整流程,帮助研究者和开发者高效获取与处理训练数据。 阅读详情

相关推荐

RDD2022 数据格式转换与清洗

Rdd2022数据集,是关于道路损伤的数据集,与rdd2020相比增加了两万多张图片但是由于格式不能被yolo直接使用且其中有大量的图片没有符合要求的标注,特写此文章记录数据清洗与格式化的过程。

蓝胖子的博客 9952

数据库索引优化与查询优化——醍醐灌顶

哪些维度可以进行数据库调优关于数据库调优的知识点非常分散。不同的 DBMS,不同的公司,不同的职位,不同的项目遇到的问题都不尽相同。这里我们分为三个章节进行细致讲解。虽然 SQL 查询优化的技术有很多,但是大方向上完全可以分成和两大块。

日常记录 2490

vue3+ts项目里如何使用状态管理pinia以及数据持久化

vue3 pinia 数据持久化

ICUiseeyou的博客 8794

Mysql数据库优化方案, 查看sql语句执行过程, 索引优化看这一篇就够了

在大中型的项目中, 随着业务的扩张, 用户量的增长, 对于我们项目的性能已提供越来越高的要求, 那么在提升项目性能的时候, SQL优化显得尤为重要. 我们将从以下4个方面对数据库优化方案进行阐述: 1. SQL性能检测 这里可能会有疑问, 我们今天探讨的是SQL优化, 为什么要提到性能检测呢? 原因就是我们想要进行优化, 要知道优化哪条SQL, 优化哪个索引, 所以SQL性能检测必不可少. 所以我们首先要介绍检测工具. 1.1 explain分析执行计划(常用的工具) 通过以上命令show status查

啊策策大数据社区 1278

PCB模块化设计24——DCDC电源模块PCB布局布线设计规范

PCB模块化设计24——DCDC电源模块PCB布局布线设计规范

qq_31444421的博客 2万+

华大HC32F460 TCP Server实验

华大HC32F460 TCP Server实验

ZhuoWuKeJi的博客 1270

数据库性能优化方案——索引优化

使用索引优化数据库性能的案例

WHYbeHERE的博客 320

深入解析mSATA与mini-PCIE接口的硬件设计要点

本文深入解析mSATA与mini-PCIE接口的硬件设计要点,涵盖信号定义、电源设计、高速信号处理及PCB布局布线等关键内容。通过实战案例和调试技巧,帮助工程师规避常见设计陷阱,提升电路设计效率,特别适合工业控制和嵌入式系统开发场景。

weixin_28741413的博客 317

数据库优化之索引

数据库优化 索引

liuwd的博客 4344

在Windows上安装Fortran编程环境「0 错误」|编程一对一教学文章

通过以上步骤,你已经成功在 Windows 系统上配置了 Fortran 编程环境。现在,你可以开始 Fortran 语言的学习和开发工作了。记得定期检查更新你的编译器和编辑器,以获得最佳的支持和新功能。

AI悦创·编程私教1v1 1674

三角洲自动购买工具 —— 基于 OCR 的价格识别与自动点击

通过的方式,我们可以轻松实现自动化的“价格监控 + 自动点击”工具。它的优势在于通用性—— 只要能截屏识别价格,就能用于任何程序,不依赖特定 API。未来可以扩展的功能:自动保存配置到文件。支持多价格区域检测。增加快捷键启停功能。

qq_62975494的博客 2419

MySQL索引优化(超详细)

MySQL索引优化,涉及到索引介绍,性能分析,查询优化,慢查询日志。

weixin_55816781的博客 9379

【图像超分】论文复现:新手入门必备!Pytorch实现SRGAN!手把手详细教程!代码注释详尽!可用于训练自己的数据集!实时验证模型性能!绘制PSNR曲线图!附训练好的各放大倍数的模型权重文件!

【图像超分】论文精读:SRResNet/SRGAN【图像超分】论文复现:万字长文!Pytorch实现SRResNet代码修改无报错!踩坑全记录!适合各种深度学习新手!帮助你少走弯路!附修改后的代码和PSNR最优的模型权重文件!请配合上述论文精读文章使用,效果更佳!与原论文描述不一样的实现部分,也即可以修改的部分数据集使用:论文中是ImageNet随机选35000张图像,本文是VOC2012数据集16700张图像。数据集预处理:裁剪大小不同,论文是96×96,本文是88×88。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 6854

TensorFlow与Keras安装避坑:环境、GPU与版本兼容实战

深度学习开发环境的核心,是 Python 包、GPU 驱动、CUDA/cuDNN 与框架版本之间的依赖匹配。TensorFlow 与 Keras 的安装看似只有几条 pip 命令,实际受虚拟环境、包管理器、镜像源和显卡工具链共同影响;版本错位会引发 DLL 缺失、GPU 不可见、Keras API 不兼容等连锁问题。把环境隔离、版本对齐和底层链路验证做好,能显著降低试错成本,也让 CPU 到 GPU 的迁移更顺畅。无论是 MNIST/CIFAR 入门实验,还是 CNN、Transformer 训练与迁移学习

WGH100817的博客 417

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

性能调优-Mysql索引数据结构详解与索引优化

最近报名了图灵学院的架构专题的付费课程,没有赶上6月份开课,中途加入的。错过了多线程的直播课程,只能看录播了????。从性能调优正式开始,视频学习,对自己很有帮助。对自己的学习进行投资是最有用的投资。加油! 本篇文章主要学习了MySQL的索引的数据结构的认识,以及一些索引优化的注意事项,做一个大概的了解即可。 一、索引 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行...

鸟不拉诗 281

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

性能调优-MySQL索引数据结构详解与索引优化

本篇文章主要学习了MySQL的索引的数据结构的认识,做一个大概的了解即可。 一、索引 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储数据结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速查找到所需的内容。 在MySQL中,存储引擎用类似的方法使用索引,先在索引中找到对应值,然后根据匹配的索引记录找到对应的行。 首先说明下MySQL的索引主要是基于Hash表或者B+树。

weixin_46794373的博客 219

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

MySQL--索引详解 创建索引 聚集索引 辅助索引 联合索引 合并索引 索引命中 索引生效 索引优化 mysql优化 慢日志管理 mysql性能调优

索引详解 创建索引 聚集索引 辅助索引 联合索引 合并索引 索引命中 索引生效 索引优化 mysql优化 慢日志管理 mysql性能调优

storyfull 999

mysql数据结构_性能调优-Mysql索引数据结构详解与索引优化

本篇文章主要学习了MySQL的索引的数据结构的认识,做一个大概的了解即可。一、索引在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储数据结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速查找到所需的内容。在MySQL中,存储引擎用类似的方法使用索引,先在索引中找到对应值,...

weixin_39661345的博客 79

【MySQL性能优化】详解:核心索引原理与SQL慢查询调优实战

开篇破题-- 查询1:没有索引(执行时间:2.3秒)-- 查询2:有索引(执行时间:0.003秒)同样的查询,275倍的性能差距!本文将用大量代码演示,带你彻底掌握索引优化。本文目标亲手创建和测试各种索引使用EXPLAIN精准诊断性能问题掌握索引设计的核心原则解决真实业务中的慢查询-- 1. 为WHERE条件中的字段创建索引-- 2. 为ORDER BY、GROUP BY字段创建索引-- 3. 考虑覆盖索引避免回表-- 4. 复合索引遵循最左前缀原则。

持续输出Java相关知识 292

设计友好关系mysql数据结构_性能调优-Mysql索引数据结构详解与索引优化

最近报名了图灵学院的架构专题的付费课程,没有赶上6月份开课,中途加入的。错过了多线程的直播课程,只能看录播了????。从性能调优正式开始,视频学习,对自己很有帮助。对自己的学习进行投资是最有用的投资。加油!本篇文章主要学习了MySQL的索引的数据结构的认识,以及一些索引优化的注意事项,做一个大概的了解即可。一、索引在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储数据结...

weixin_34614674的博客 245

【优快云软件工程师能力认证学习精选】MySQL性能调优——索引详解与索引的优化

优快云软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网优快云制定并推出的一个能力认证标准。C系列认证历经近一年的实际线下调研、考察、迭代、测试,并梳理出软件工程师开发过程中所需的各项技术技能,结合企业招聘需求和人才应聘痛点,基于公开、透明、公正的原则,甑别人才时确保真实业务场景、全部上机实操、所有过程留痕、存档不可篡改。 我们每天将都会精选优快云站内技术文章供大家学习,帮助大家系统化学习IT技术。 ——索引优化,可以说是数据库相关优化、理解尤其是查询优化中最常用的优化手段之一。所以.

优快云高校俱乐部官方博客 523

MySQL性能优化全攻略:从SQL编写、索引调优到配置详解,吃透这一篇就够了(上篇)

本文系统介绍了MySQL性能优化的金字塔模型,从架构优化到数据库设计、SQL优化、索引优化四个层面提供解决方案。重点包括:1)架构层面采用缓存、读写分离、分库分表;2)数据库设计强调合理选择数据类型和存储引擎;3)SQL优化着重使用EXPLAIN分析执行计划,避免全表扫描;4)索引优化需遵循最左前缀原则,注意区分度与性能平衡。文章还推荐了实用的MySQL备份工具,帮助提高工作效率。

xhbh666的博客 702
上一篇: 如何为mysql建立索引
下一篇: 理解MySQL索引和优化
想念-忘记了
博客等级 码龄10年 64粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值