索引:是帮助MySQL高效获取数据的排好序数据结构

mysql 索引的底层数据结构:

  • 二叉树:如果是规律性数据,比如1,2,3.....等数据,存储容易成线性结构,数据规模太大之后,查询太慢。
  • 红黑树(hashap的底层数据结构):存在自平衡性问题,虽然不会出现单边增长,但是在数据量太大的时候,数据树的高度是不可控的,向下检索很慢。
  • hash:通过hashcode通过位置指针多次定位,某些情况下也是很快的。但是没法实现范围检索,比如id>10,这个条件检索就没法使用hasdcode来查询。

  • B-Tree:在红黑树的基础上,每个节点可以存储多个数据。横向增加数据个数,这样,就从解决了纵向数据树太高问题。B-Tree有个很重要的属性度(degree):每个节点最多可以存储多少个数据。比如定义一个B-Tree的某个节点的度为4。最大存储容量是15/16。有人会说,那么我们直接定义度=数据个数不就可以了么,这样就只有一层,不就更快了么。这里有要说到cpu的I/O操作了,java程序操作数据的过程:java程序 》 cpu 》内存(如果内存中没有数据)》磁盘。而内存与磁盘数据交互的时候是有限制的,一般单位是“页”,一页=4k。也就是说一个节点最多能存储4k的数据,如果太多的话I/O操作还是会变慢。我们看到B-Tree每个节点都存储的是key+data的形式,有时候数据库表的一行数据会有很多列,就是说data会大,这样会不会影响到B-Tree的效率呢。这是有人提出能不能把data去掉,所以就有了B-Tree的升级版B+Tree。

  • B+Tree:在B-Tree的基础上在非叶子节点上只存放key这样就大大节省了空间。而叶子节点是存放key+data,并且key是按照从左自右递增的链表形式,通过next指正就可以很快的找到需要的数据。

mysql的存储引擎又分为MyISAM和innodb :

MyISAM:在mysql的安装目录data下,可以看到主要文件有1、表结构文件。2、数据结构文件。3、index索引文件。也就是说MyISAM的数据结构和索引结构文件是分开的(非聚集)。

MyISAM索引中,叶子节点存储的data是文件地址指针, 而数据结构中也是有一个地址的。也就是在索引出来文件地址之后,还需要通过文件地址在从数据结构中尽心一次索引,也就是要进行两次搜索。

InnoDB:在mysql的安装目录data下,只有两个文件,一个是表结构文件,一个是数据结构和索引文件。(聚集)

InnoDB的主键和非主键索引的B+Tree结构是不一样的。

主键:非叶子节点存储的是主键id,叶子节点存储的是每一行的数据。

非主键:非叶子节点存储的我们自己所设置的索引键,如果不是整数,就按ASC码排序,叶子节点存储的data是主键id。

InnoDB的主键id为什么要设置成自增整数,而不用UUID/UNID。原因是因为自增主键在非叶子节点添加的时候,总是往右新增就可以了,方便插入。如果用UUID/UNID作为主键,非叶子节点插入数据是还需要开辟新的页。影响效率。

mysql 联合索引:数据库中的多个列组成一个索引。但是要注意:

1、需要加索引的字段,要在where条件中
2、数据量少的字段不需要加索引
3、如果where条件中是OR关系,加索引不起作用
4、符合最原则:
联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,ba,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

结论:MyISAM的查询速度相比较InnoDB的查询速度要慢,因为MyISAM是进行了两次查询。

mysql 索引底层数据结构与算法相关推荐

  1. mysql索引数据结构图解_深入理解Mysql索引底层数据结构与算法

    索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构. Q1:大家使用索引有没有想过这个问题?为什么索引能够帮助mysql高效获取数据?我一一给大家道来!在给大家讲之前,先更大家分享一 ...

  2. mysql专题(一):深入理解Mysql索引底层数据结构与算法

    Mysql索引 帮助MySQL高效获取数据的排好序的数据结构. 1.索引 一种为表的行提供快速查找功能的数据结构,通常通过形成表示特定列或列集 的所有值的 树结构(B 树)来实现. InnoDB表总是 ...

  3. mysql 联合主键_深入理解Mysql索引底层数据结构与算法,背后的故事

    引言 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构对比 二叉树 左边子节点的数据小于父节点数据,右边子节点的数据大于父节点数据.如果col2是索引,查找索引为89的行元素,那么只需 ...

  4. 深入理解Mysql索引底层数据结构与算法

    索引 索引是帮助MySQL高效获取数据的排好序的数据结构(容易忽略的点:排好序)(形象点就是教科书的目录) 索引存储在文件里(也就是说有IO操作) 索引结构: 这里说说在几种数据结构中,mysql为什 ...

  5. 深入理解硬盘原理,Mysql索引底层数据结构与算法的来龙去脉(多图)

    前言: 如何触发尽量少的磁盘io 找到数据? 数据库中的索引是什么? 硬盘原理 现在大部分存储设备依然是硬盘 信息存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片.假设,你用显微镜把盘片放大, ...

  6. 面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...

  7. Mysql——索引底层数据结构与Explain用法

    Mysql--索引底层数据结构与Explain用法 一.索引底层数据结构 1.Mysql不同引擎对应的数据结构 2.B+Tree数据结构 2.1. 二叉树 (Binary Search Trees) ...

  8. MySQL索引底层数据结构

    MySQL相信大家都不陌生,索引的日常使用应该也是比较频繁的,今天就聊一聊索引底层的数据结构; MySQL索引底层为什么使用B+树而不是二叉树;红黑树;B树? 索引:索引是帮助MySQL高效获取数据的 ...

  9. MySQL索引底层数据结构原理剖析

    一. 前言 1. 说明 我们平时所说的:聚集索引(主键索引),次要索引,覆盖索引,复合索引,前缀索引,唯一索引在MySQL5.7和 8.0版本默认都是使用B+Tree索引,除此之外还有 Hash索引. ...

最新文章

  1. html代码闪烁的文字怎么打,HTML最简单的文字闪烁代码
  2. 【 压缩感知 】OMP恢复算法
  3. Nature:万物皆可“编程”,结构材料也能实现数据存储,华人科学家一作
  4. HUST 1541 Student’s question
  5. 图的表达与遍历--邻接矩阵和邻接表
  6. 机器学习领域有哪一些值得关注的人
  7. 漫步线性代数十六——投影和最小二乘
  8. 八皇后问题的非递归解法
  9. WPF简单实用方法(持续更新)
  10. Visual Studio自动生成XML类和JSON类
  11. c语言实现《学生管理系统》
  12. 计算机实验室场地报告,实验室申请报告.doc
  13. Win10 安装rational rose 7教程
  14. token干什么用_token是什么意思(token的含义及使用方法)
  15. Modeling Personalized Item Frequency Information for Next-basket Recommendation
  16. 一次Linux中的木马病毒解决经历
  17. 使用特网云云主机的最显着原因之一
  18. Picsee for mac(最好的图片管理查看器)
  19. 服务器上虚拟内存怎么设置方法,服务器的虚拟内存设置方法
  20. c语言自动贩卖机设计报告,自动贩卖机电子技术课程设计

热门文章

  1. surface go写php,【反馈】超便宜:851rmb的Surface go - 笔记本电脑(Notebook)版 - 北大未名BBS...
  2. 常见算法思想2:递推法
  3. 河南师范大学计算机学院地址,河南师范大学校区有几个 地址是什么
  4. Python实现带不等式约束的NSGAII算法解决cec2021中的RCM01问题
  5. 指令集 x 数澜科技丨加速政企数字化转型,打造DT领域独角兽企业联盟
  6. 神秘代码(链接至steam指南)
  7. iastora怎么改成ahci_Win10系统无需重装,硬盘IDE改为AHCI模式的方法
  8. python 分类变量转为哑变量_Python中的虚拟变量(dummyvariables)
  9. 任务一深度思考之测试
  10. HALCON数组的删除 三