mysql索引以及算法数据结构

从‘静态拍照’到‘动态录像’:用Malmquist指数讲好你的效率变化故事(附Stata/R代码) 本文深入探讨了如何利用Malmquist指数构建动态效率分析框架,从静态数据到动态叙事的转变。通过分解技术效率变化(EC)和技术进步(TC),结合Stata/R代码实现四种动态可视化方法,帮助研究者更直观地展示效率变化的动态特征。文章还提供了诊断性叙事结构和比较叙事技巧,助力决策者理解效率提升的来源与趋势。 阅读详情

一、序言

    这个问题是属于mysql中比较有难度的问题了,毕竟数据结构是构成计算机的重要部分,做过开发的朋友都知道索引能够帮助我们提升sql查询的能力,但是索引到底是什么?为什么能够做到这一点,接下来就揭开索引的面纱。

二、索引是什么?为什么使用索引?

    索引简单来说就是帮助我们优化sql,提升查询性能的一种手段,也可以说它是一种数据结构,索引就是通过不断的缩小想要的数据的范围筛选出来最终的结果,同时将随机的事件变成顺序事件。也就是使用索引的方式快速锁定我们想要的数据。

 三、预备知识

    既然说索引是一种数据结构,这种数据结构有什么优势?从哪个切入点进行优化的?先不着急,先了解一下计算机组成原理以及操作系统相关的一些知识,它能够帮助我们更好的理解索引(数据结构)。

     1、磁盘IO和预读

      磁盘IO,其实就是对磁盘中数据的读和写,这个相比在内存加载来说是非常低的。查询数据的时候为了减少访问IO的次数,就将索引设计成为B+Tree,保存索引的时候,其数据结构保证查询的时候使用最少的IO次数查询出结果。

     那么朋友们可能会问:

       (1)既然为了访问最少的次数,不都放到同一层,如果都放到一层,时间复杂度为O(n),需要一个个的去遍历,效率非但没有提升;另外都放到同一层,操作系统的预读和行记录存储方式也不允许,效率不见得有多高,并且随着数据量的增加,效率会明显的有差异。

        (2)为什么使用T+Tree而不是红黑树或者二叉平衡树等,因为它们的高度比B+Tree高,有多高查询的时候就需要多查询多少次,进行多少次的IO操作。

        (3)既然使用B+Tree算法,为什么每个节点上面不多放一些数据这样的话高度就会减少,IO操作次数就会减少,因为这个会涉及到操作系统的预读和数据的行记录存储方式(下面会说),操作系统一次预读,读取的有限,所以每个节点上面不能够放足够多的数据。

      预读,考虑到磁盘IO是非常昂贵的操作,计算机操作系统帮助我们做了优化,当一次IO不光通过磁盘中数据地址将指定的数据读取出来加载到内存中,还会把该数据相邻的数据也读取到内存中,因为操作系统虽然不能够智能化的读取人大脑的信息从而预测下一步读取什么数据,但是它却使用另外一种方式,其认为既然读取了当前的数据,也就是说相邻的数据被使用的几率也是相对较大的,所以就将该数据相邻的数据也读取出来。每次IO读取的数据我们称之为一页,具体一页有多大跟操作系统有关系,一般是4K或者8K,也就是说我们读取一页数据其实就是发生了一次IO。

   2、mysql数据在磁盘上的存储方式

    mysql在磁盘上是以数据块为单位存储的,然而一个存储块又是由多个磁盘块组成的。存储引擎负责管理数据块,mysql读取表中的数据到内存中也是一块一块的读取的,假如要查询的表和其他表都在同一个数据库中,加载块的时候,读取要查找的表,其他表也会被查出来。

    当一个块内的部分表被删除的时候,这就形成了碎片,这样会降低装载到内存的速度,所以为了解决这个问题,会形成一个的块头,用来记录一个数据块内表的大小,有无空闲空间以及空闲空间的位置等。

    mysql是按照行存储数据的,因此一行数据是一个统一的物理地址,mysql的最小存储单位为数据块,所以可能会出现字段比较少,多条记录在同一块中。

    相对应的列式数据库不同的字段存放在不同的地址中。

 

四、索引的种类

   我们在网上查找mysql索引的时候肯定会搜到什么主键索引、唯一索引、组合索引、聚集索引、非聚集索引等,一些文章并没有准确的划分,导致我们一知半解,区分不出来,这里呢就帮助朋友们稍微的区分一下

    聚集索引(聚簇索引)

       数据行的存储顺序和某列的值的存储数据是一直的,一般这一列被称为主键。

   如上图所示:第一列是数据行在磁盘上的存储地址,数据行的存储地址和id的排列顺序是一致的。所以一张表中只有一个主键列,如果我们创建数据块表的时候没有创建主键,但是没关系,数据库会默认为我们创建一列主键。

    所以一般说聚集索引其实就是主键索引

    非聚集索引

     非聚集索引可以这样理解,数据行的排列顺序和该索引中的索引列无关,所以简单来说就是除了聚集索引(主键索引)之外的都是非聚集索引,既然说了除了主键索引其他都是非聚集索引,那么毫无疑问普通索引、唯一索引、组合索引等都是非聚集索引。

    唯一索引

            唯一索引不允许两行的该索引列相同,但是可以为null的,并且可以有多个null,这也是主键索引和唯一索引的一个区别,也可以说主键索引在形式上就是唯一索引的一种特殊类型。但是两者确实没有什么可比性,不在同一起跑线上,没有办法做对比。在同一张表中唯一索引可以有多个。这里朋友可能会迷惑,有了主键索引还要什么唯一索引,不为什么就是因为一张表中只能有一个主键索引,所以才有了唯一索引。

    组合索引

            多个字段共同组成一个索引,其遵循最左前缀原则,至于最左前缀原则下面会讲解,组合索引中的几列必须唯一,这里我们又有了疑惑,既然有了唯一索引,并且唯一索引在一张表中可有多个,那为什么还要什么组合索引,因为索引也是要占用空间的,如果有三个列age、name、city,如果在每个上面都加上唯一索引或者普通索引的话,首先占用内存上面要比组合索引多,效率也不见得比组合索引查询效率高,存储引擎会选择三个单列索引中效率较高的索引查询作为辅助索引,不明白为什么没关系,等下面看了索引的数据结构就明白了。

    普通索引

             索引列可以重复,也是我们最常用的,既然有了唯一索引为什么还是用普通索引,不为什么就是因为列可以重复。

    全文索引

              全文索引仅能够作用于myisam总的char、varchar、text。

     覆盖索引

               该索引也是最近学习的时候察觉到的,之前对索引以及sql优化并不是太了解,只从学习了之后才发现,这太有用了,对sql优化有很大的帮助。感觉有必要珏哥例子说一下。

        举例:目前有一张学生表:student_id(主键) 、student_name(名称)、age(唯一索引)

         select age from student;

        现在查找所有的age字段,哈哈,这是不涉及数据的,只是涉及到索引,因为我们知道innodb中age是辅助索引,如果想要通过辅助索引查找某一行数据的话,首先遍历age索引对应的B+Tree,找到对应的主键,然后通过主键去遍历主键B+Tree,找到对应的数据行信息,也正是因为这一点,如果只是查找age的话不需要再去通过主键索引的B+Tree查找数据行记录,而是仅仅遍历了age的唯一索引B+Tree,速度提升了。

五、索引的数据结构

    其实本篇文章中最重点的就是这里了。先说使用的算法:B-Tree、B+Tree。

   1、现在大都使用B+Tree为什么不使用B-Tree?

      B-Tree结构图

     上面说过的,每个节点只有尽可能的存储多个值才能够降低树的高度,树的高度才能够决定访问IO的次数,如果每个节点放的没有数据,这样的话,可以节省下来一部分空间放置键值和指针,高度肯定降低(每个节点是操作系统的预读大小,大小是固定的)。

     上面是B-Tree结构图,B+Tree的结构图先不放了,下面都是B+Tree的结构图,自己进行对比即可

     2、目前使用的是B+Tree的变种而并非是B+Tree,为什么?

 

    其实B+Tree结构图中并没有叶子节点之间的指针的,当我们使用主键作为范围查找的时候,叶子节点之间的指针就有很明显的优势了。

 MYISAM

     

   非叶子节点并不存储真正的数据,每个叶子节点都是存储的索引列以及对应行的地址,这里是和innodb的一个区别,因为在数据库引擎一文中说过,两者的文件存储方式不同,myisam中索引和数据行不再同一文件中,所以每个叶子节点都是存放对应行的地址。而innodb中索引和记录在同一行,所以每个叶子节点存储的是记录本身。

INNODB

  主键索引

  

     叶子节点包含了完整的数据记录,这种索引叫做聚集索引,因为innodb的数据文件本身要按主键具体,所以innodb要求表必须由主键(myisam可以没有),如果没有显示指定,innodb会自动为该表生成一个主键列,首先会在表中查找是否由某个列可以唯一标识数据记录,如果有的话,就使用该列作为主键,如果没有就生成一个隐含字段作为主键,这个字段的长度为6个字节,类型为长整型。

   辅助索引搜索时

   

   通过辅助索引查找的时候,就是先查找辅助索引的B+Tree,找到对应的主键之后,然后查找主键索引的B+Tree,查找到对应的数据行的数据。

  组合索引:

      因为组合索引和其他非主键的单列索引一样的道理,只不过数据结构不太好想象

    图中对应地址就是主键地址,是不是道理是一样的。

 

 

六、最左前缀原则

    这个没什么好说的,因为上面图中的组合索引已经明显的表达出来了,如果age、name、sex作为组合索引

    (1)select * from student where name = '张三' and sex = '男'

         上面是不走组合索引的,因为结构图中索引是以age作为主索引进行组合B+Tree的,直接使用name、age达不到效果

    (2)select * from student where age = 12 and sex = '男'

         从删改你组合索引图可以看到,走组合索引,但是sex并未起效

   (3)select * from student where age = 12 and name = '男'

         从删改你组合索引图可以看到,走组合索引,并且age、name都起作用

   (4)select * from student where age = 12 and name = '张三' and sex = '男' 

         从删改你组合索引图可以看到,走组合索引,并且age、name、sex都起作用了。

    这就是最左前缀原则,当然了,有必要说的就是,如果你给age添加了唯一索引,或者其他的什么情况,执行引擎可能会根据效率来判断是走唯一索引还是组合索引,这都是可以通过explain关键字可进行分析的,关于执行计划explain的解析请移步看我的另一篇文章。

  

注意事项

  1. 范围查询

Mysql会一直向右匹配,直到遇到(>、<、between、like)就停止匹配,范围列可以使用索引,但是范围列后面的列无法使用索引,即:索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全部使用索引

  1. like索引问题

如果通配符不出现在开头,则可以使用索引,但根据具体情况不同坑你只会用其中一个前缀在like ’value%’可以使用索引,但是like’%value%’不会使用索引,走的时全表扫描

 

七、总结

   这篇文章如果理解了,特别上面的图,索引相关的问题都基本能够沿用这个思路解决自己的疑惑。这篇文章确实有些难度,一旦理解,相信受益匪浅,加油,朋友们有什么感觉写的有什么的问题或者有什么不对的地方尽管提出来,及时进行回复和修改。

 

 

第3章 基于三电平空间矢量的中点电位平衡策略 本文档深入探讨了基于三电平空间矢量的中点电位平衡策略。重点在于NPC型三电平逆变器的中点电位平衡问题,由于三电平结构的特点,使得直流侧两个电解电容器的充放电不均匀导致中点电压不均衡。文章通过对不同矢量作用下电流、电压的变化进行了详细的定量和定性分析,并提出了利用冗余小矢量的合理配置以及引入调制因子来解决中点电位偏移的方法,确保中点电压在一个完整的开关周期内的稳定性,进而提高系统的可靠性。 阅读详情

相关推荐

【深度学习】肺结节分割项目实战一:处理数据集

一、LIDC-IDRI数据集简介 官方网站 肺图像数据库协会的图像收集(LIDC-IDRI)包括诊断和带有病变注释标记的肺癌筛查胸部CT。这是一个网络公开的国际资源,用于肺癌检测和诊断的计算机辅助诊断(CAD)方法的开发、培训和评估。 数据集包含1018个病例,每个病例包括来自临床胸部CT扫描的图像和一个相关的XML文件,该文件记录了由四名经验丰富的胸部放射科医生进行的两阶段图像注释过程的结果。在最初的盲读阶段,每个放射科医生独立审查每个CT扫描,并标记出属于三种类型之一的病变(“结节>= 3mm”,

weixin_42182906的博客 1万+

B-树(最小I/O次数)

#include<iostream> #include<cstdio> #include<stdbool.h> #include"bin_tree.h" // 用这里面的release #include"vector.h" using namespace std; template<typename T> struct bt_node; template<typename T> using bt_node_pos

qq_49968057的博客 331

基于STM32的宠物智能照护嵌入式系统设计

嵌入式系统是实现物联网终端设备本地化感知、决策与执行的核心技术载体,其关键在于多传感器融合、低功耗执行控制与轻量级云边协同。本文围绕环境监测(温湿度、烟雾、余粮)、机电执行(步进电机食盘、继电器风扇)和可靠通信(MQTT+ESP8266)三大技术主线,深入解析STM32F103在资源约束下的外设调度策略、ADC采样抗干扰设计、DHT11时序精准控制及HX711称重滤波算法等工程实践要点。系统强调本地闭环优先原则,确保离线基础功能可用,同时通过阿里云IoT平台实现远程监控与告警联动,为中小型智能硬件项目提供可

weixin_29155599的博客 296

Java面试-MySql索引的数据结构和优势

Mysql使用时B+Tree作为索引文件的数据结构。

m0_38010311的博客 349

【Py/Java/C++/C/JS/Go六种语言OD独家2024E卷真题】20天拿下华为OD笔试之【固定滑窗】2024E-考勤信息【欧弟算法】全网注释最详细分类最全的华为OD真题题解

可上练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【优快云】否则不通过)

weixin_48157259的博客 620

【完整梳理验证】企业微信第三方应用接入全流程java版

由企业内部的开发者自己开发部署,相当于是企业自己的资产,调用接口基本没有任何限制。由SaaS服务商的开发者开发并部署在服务商侧,面向所有企业。需要企业授权使用(先试用后付费),服务商仅可获取企业授权部分的权限,相当于白名单控制。由服务商的开发者开发,但部署在企业内部。一般是线下签约采购方式,因此权限几乎与自建应用无异,企业管理员只需要配置不对服务商开放的敏感权限,相当于黑名单控制。服务商后台地址:企业微信服务商官网企业管理后台地址:企业微信管理后台服务商,可以理解为 SAAS 中的运营端。企业管理端,可以理

Hello, New World! 2768

【数据结构】B+树

在看B+树之前,推荐先看一下B-树的原理 概念 1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存实际的时候,只用来作为索引,所有数据都保存在叶子结点。 2.所有叶子结点中包含了全部信息,以及志向含这些元素记录的指针,并且叶子结点本身依靠关键字的大小自小到大按照顺序链接 3.所有中间节点的元素都同时存在于子节点,在子节点元素中是最大(或最小)的元素 如图就是一个B+树,其中中间节点和根节点都存储的数据不是实际的数据...

Elephant_King的博客 1619

【局部规划模块曲线算法】曲线平滑介绍

本文先对轨迹平滑问题做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容(1)适合给移动机器人运动的路径【满足运动学,高阶平滑】(2)高阶的运动学不能够突变的【至少三阶的加速度不能突变,最好四阶的jerk和五阶的snap也不能突变】(3)在转弯的地方不会停下来(4)加减速均衡,节省能量(5)节省时间的。

qq_35635374的博客 5718

不同存储结构的文件磁盘io操作次数_基于磁盘IO角度来看二叉树、B-tree树、B+树...

概述前面已经介绍了B-TREE的相关内容,所以这里对其架构就不多做介绍了,主要是从磁盘IO的角度来看,看一下为什么要用B树。相关概念B树这种数据结构常常用于实现数据库索引,因为它的查找效率比较高。1、磁盘IO与预读磁盘读取依靠的是机械运动,分为寻道时间、旋转延迟、传输时间三个部分,这三个部分耗时相加就是一次磁盘IO的时间,大概9ms左右。这个成本是访问内存的十万倍左右;正是由于磁盘IO是非常昂贵的...

weixin_39616686的博客 1910

ArcMap|使用模型构建器将kml文件批量转图层

参考:https://www.jianshu.com/p/6de18f846024 第一步:打开模型构建器,拖入kml转图层工具 第二步:插入文件迭代器 第三步:双击“迭代文件”,选择kml所在文件夹 第四步:将“File.kml”与“KML转图层”连接,点击“输入KML文件” 第五步:双击“KML转图层”,更改输出位置,输出数据名称改为%名称% 第六步:运行模型 得到结果: ...

个人学习笔记 3602

数仓建模—维度建模之维度表

首先要学会识别维度,维度是相对稳定的、可抽象具有共性的、固有的(天然的)描述度量或事实的上下文属性信息,失去维度信息的度量信息是没有意义的或者说是失去维度信息的事实表是没有意义的。其次要掌握维度表的设计原则和设计流程,从而更加科学的设计维度表,其实这些东西都是术,我们一直都说一句话大道至简,其实如果你掌握了精髓,抛开这些术也可以做到得心应手,这就像张无忌练太极剑一样,忘记了才能达到道的境界,也就是无我,如果做不到就记住这些原则加以应用从而达到术的境界。

2401_84052244的博客 4364

不同存储结构的文件磁盘io操作次数_树形结构效率对比

二叉查找树 (Binary Search Tree)概念二叉查找树又称二叉搜索树,二叉排序树,特点如下:左子树上所有结点值均小于根结点右子树上所有结点值均大于根结点结点的左右子树本身又是一颗二叉查找树二叉查找树中序遍历得到结果是递增排序的结点序列。BST 的操作代价分析:查找代价:任何一个数据的查找过程都需要从根结点出发,沿某一个路径朝叶子结点前进。因此查找中数据比较次数与树的形态密切相...

weixin_39934613的博客 810

Claude Code 完全指南:从入门到精通

《AI编程助手ClaudeCode深度指南》摘要 ClaudeCode作为新一代AI编程助手,凭借200K tokens的超长上下文窗口和深度代码理解能力,正在重塑开发工作流程。本文系统介绍了从安装配置到高级应用的完整使用指南: 核心优势包括: 项目级代码理解能力 Agent自主规划复杂任务 原生终端集成支持 多文件协同编辑功能 实战应用场景: 快速理解陌生项目架构 诊断性能瓶颈并提供优化方案 自动生成符合规范的API代码 开发可复用技术组件 高级技巧: 通过CLAUDE.md定义项目规范 合理使用/cle

分享AI、区块链技术及应用,未来已来 605

MySQL索引背后的数据结构及算法原理

本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容分为三个部分。第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。

攻城狮不是猫 2014

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MySQL索引数据结构与算法

MySQL索引数据结构与算法 文章目录MySQL索引数据结构与算法1、索引2、索引结构二叉树与红黑树的比较HASHB-TreeB+TreeMyISAM索引实现(非聚集)InnoDB索引实现(聚集) 1、索引 索引是帮助MySQL高效获取数据的排好序的数据结构(容易忽略的点:排好序)(形象点就是教科书的目录) 索引存储在文件里(也就是说有IO操作) MyISAM 表的磁盘文件有三个: .frm (...

qq_36452584的博客 432

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深入MySQL索引背后的数据结构及算法原理

MySQL索引背后的数据结构及算法原理 在编程领域有一句人尽皆知的法则“程序 = 数据结构 + 算法”,我个人是不太赞同这句话(因为我觉得程序不仅仅是数据结构加算法),但是在日常的学习和工作中我确认深深感受到数据结构和算法的重要性,很多东西,如果你愿意稍稍往深处挖一点,那么扑面而来的一定是各种数据结构和算法知识。例如几乎每个程序员都要打交道的数据库,如果仅仅是用来存个数据、建建表、建建索引、做做增删改查,那么也许觉得数据结构和这东西没什么关系。不过要是哪天心血来潮,想知道的多一点,想研究一下如何优化...

硒氪的博客 581

MySQL索引底层数据结构和算法详解

MySQL索引的核心目的是高效定位数据,其底层实现依赖于多种精心设计的数据结构和算法。不同存储引擎和索引类型采用不同的实现方式。

m0_69378371的博客 1097

mysql索引底层数据结构和算法

为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。一个节点的左键点小于该节点,右节点大于该节点,但是如果插入二叉树的数据是有序的,就会形成二叉树的极端情况,形成链表,我们知道树的查询复杂度跟树的高度有关,树越高,那么查询事件复杂度就越高,并且需要更多的磁盘IO,所以需要通过某种约束来保证树的平衡,所以MySQL不用二叉存储索引;

2501_90404066的博客 857

性能调优——14 深入理解MySQL索引底层数据结构与算法

索引数据结构详解、千万级数据表如何用B+树索引快速查找、聚集索引&聚簇索引&稀疏索引到底是什么?为什么DBA总推荐使用自增主键做索引?联合索引底层数据结构又是怎样的?Mysql最左前缀优化原则是怎么回事?索引失效怎么避免?

念头通达 1078
上一篇: mysql之事务讲解
下一篇: mysql之隔离级别
JavaWeb_Hao
博客等级 码龄9年 21粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值