mysql 索引底层数据结构与算法
索引:是帮助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,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
结论:MyISAM的查询速度相比较InnoDB的查询速度要慢,因为MyISAM是进行了两次查询。
mysql 索引底层数据结构与算法相关推荐
- mysql索引数据结构图解_深入理解Mysql索引底层数据结构与算法
索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构. Q1:大家使用索引有没有想过这个问题?为什么索引能够帮助mysql高效获取数据?我一一给大家道来!在给大家讲之前,先更大家分享一 ...
- mysql专题(一):深入理解Mysql索引底层数据结构与算法
Mysql索引 帮助MySQL高效获取数据的排好序的数据结构. 1.索引 一种为表的行提供快速查找功能的数据结构,通常通过形成表示特定列或列集 的所有值的 树结构(B 树)来实现. InnoDB表总是 ...
- mysql 联合主键_深入理解Mysql索引底层数据结构与算法,背后的故事
引言 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构对比 二叉树 左边子节点的数据小于父节点数据,右边子节点的数据大于父节点数据.如果col2是索引,查找索引为89的行元素,那么只需 ...
- 深入理解Mysql索引底层数据结构与算法
索引 索引是帮助MySQL高效获取数据的排好序的数据结构(容易忽略的点:排好序)(形象点就是教科书的目录) 索引存储在文件里(也就是说有IO操作) 索引结构: 这里说说在几种数据结构中,mysql为什 ...
- 深入理解硬盘原理,Mysql索引底层数据结构与算法的来龙去脉(多图)
前言: 如何触发尽量少的磁盘io 找到数据? 数据库中的索引是什么? 硬盘原理 现在大部分存储设备依然是硬盘 信息存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片.假设,你用显微镜把盘片放大, ...
- 面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?
哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...
- Mysql——索引底层数据结构与Explain用法
Mysql--索引底层数据结构与Explain用法 一.索引底层数据结构 1.Mysql不同引擎对应的数据结构 2.B+Tree数据结构 2.1. 二叉树 (Binary Search Trees) ...
- MySQL索引底层数据结构
MySQL相信大家都不陌生,索引的日常使用应该也是比较频繁的,今天就聊一聊索引底层的数据结构; MySQL索引底层为什么使用B+树而不是二叉树;红黑树;B树? 索引:索引是帮助MySQL高效获取数据的 ...
- MySQL索引底层数据结构原理剖析
一. 前言 1. 说明 我们平时所说的:聚集索引(主键索引),次要索引,覆盖索引,复合索引,前缀索引,唯一索引在MySQL5.7和 8.0版本默认都是使用B+Tree索引,除此之外还有 Hash索引. ...
最新文章
- html代码闪烁的文字怎么打,HTML最简单的文字闪烁代码
- 【 压缩感知 】OMP恢复算法
- Nature:万物皆可“编程”,结构材料也能实现数据存储,华人科学家一作
- HUST 1541 Student’s question
- 图的表达与遍历--邻接矩阵和邻接表
- 机器学习领域有哪一些值得关注的人
- 漫步线性代数十六——投影和最小二乘
- 八皇后问题的非递归解法
- WPF简单实用方法(持续更新)
- Visual Studio自动生成XML类和JSON类
- c语言实现《学生管理系统》
- 计算机实验室场地报告,实验室申请报告.doc
- Win10 安装rational rose 7教程
- token干什么用_token是什么意思(token的含义及使用方法)
- Modeling Personalized Item Frequency Information for Next-basket Recommendation
- 一次Linux中的木马病毒解决经历
- 使用特网云云主机的最显着原因之一
- Picsee for mac(最好的图片管理查看器)
- 服务器上虚拟内存怎么设置方法,服务器的虚拟内存设置方法
- c语言自动贩卖机设计报告,自动贩卖机电子技术课程设计
热门文章
- surface go写php,【反馈】超便宜:851rmb的Surface go - 笔记本电脑(Notebook)版 - 北大未名BBS...
- 常见算法思想2:递推法
- 河南师范大学计算机学院地址,河南师范大学校区有几个 地址是什么
- Python实现带不等式约束的NSGAII算法解决cec2021中的RCM01问题
- 指令集 x 数澜科技丨加速政企数字化转型,打造DT领域独角兽企业联盟
- 神秘代码(链接至steam指南)
- iastora怎么改成ahci_Win10系统无需重装,硬盘IDE改为AHCI模式的方法
- python 分类变量转为哑变量_Python中的虚拟变量(dummyvariables)
- 任务一深度思考之测试
- HALCON数组的删除 三