精华内容
下载资源
问答
  • MySQL索引底层数据结构索引到底是什么联合索引结构MyISAM索引文件和数据文件是分离的主键索引普通索引InnoDB索引实现主键索引普通索引 索引到底是什么 索引是帮助MySQL高效获取数据的 排好序 的 数据结构 索引存储...

    索引到底是什么

    • 索引是帮助MySQL高效获取数据的 排好序数据结构
    • 索引存储在文件,MySQL使用的数据结构为 B+Tree
      在这里插入图片描述

    数据结构教学网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
    B-Tree 数据结构:https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653190965&idx=1&sn=53f78fa037386f85531832cd5322d2a0&chksm=8c9909efbbee80f90512f0c36356c31cc74c388c46388dc2317d43c8f8597298f233ca9c29e9&scene=21#wechat_redirect
    B+Tree 数据结构:https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653191027&idx=1&sn=4ba22e3ec8bd149f69fc0aba72e4347e&chksm=8c9909a9bbee80bfa1d8497ff0525df130414c1731b5aa5287bf16ea1cf86c8d8e6f20782184&scene=21#wechat_redirect

    联合索引结构

    在这里插入图片描述

    聚集索引和非聚集索引

    根本区别

    • 数据的物理存放顺序与索引顺序是否一致

    MyISAM和InnoDB的索引

    • MyISAM的B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。主索引和辅助索引没啥区别,只是主索引中的key一定得是唯一的。这里的索引都是非聚集索引。

    • InnoDB的数据文件本身就是索引文件,B+Tree的叶子节点上的data就是数据本身,key为主键,这是聚集索引。非聚集索引,叶子节点上的data是物理地址(所以聚集索引的key,不能过长)。为什么存放的主键,而不是记录所在地址呢,理由相当简单,因为记录所在地址并不能保证一定不会变,但主键可以保证。

    • 至于为什么主键通常建议使用自增id呢?

    MyISAM索引文件和数据文件是分离的(非聚集)

    主键索引

    在这里插入图片描述

    普通索引

    在这里插入图片描述

    InnoDB索引实现(聚集)

    主键索引

    在这里插入图片描述

    普通索引

    在这里插入图片描述

    1. 数据文件本身就是按B+Tree组织的一个索引结构文件
    2. 索引-叶子节点包含了完整的数据记录
    3. 为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?
    4. 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)
    展开全文
  • Mysql索引底层数据结构(B树) 一.什么是B树 B - Trees是一种平衡的多叉树,称为B树(或B-树、B_树),也是数据结构中树形结构的一种。 二.什么是索引,为什么要用要索引 索引是帮助Mysql高效获取数据的排好序的数据...

    Mysql索引底层数据结构(B树)

    一.什么是B树

            B - Trees是一种平衡的多叉树,称为B树(或B-树、B_树),也是数据结构中树形结构的一种。

    二.什么是索引,为什么要用要索引

            索引是帮助Mysql高效获取数据的排好序数据结构,用于快速找出在某个列中有一特定值的行。

            假如数据库有一张表(user)他的字段有col1和col2,我们的表是在我们的磁盘上,如果语句写成select * from user where col1 = 6; 他就会从第一行开始,把磁盘上每一行数据都读取出来,直到查找到col1 = 6的数据,我们如果不进行任何辅助手段帮助查询的话,那么我们查找到这一行数据要进行6次的磁盘I/O。如果我们表的数据是百万级别的,而且数据恰好位于表的底层呢?那要经过多少次的磁盘I/O,效率自然会非常低。 如果没有加索引,查询的数据时就很可能会进行全表扫描。

    三.Mysql中索引用到的数据结构

            上节说到,索引是排好序的数据结构,那么它用到了哪种数据结构?
            如果学过数据结构的朋友估计对二叉树肯定不陌生,二叉树虽然能够解决查询的次数问题,但二叉树一个节点的容量只能存一个索引,查找一个位与整个树底端的数据所用到的次数就会随着整个树的高度增加。那我们如果不想让整个树的高度变得不可控,就可以在横向扩容,设置一个节点的容量,让其能够存储多个索引,那么就引出了B树。
    B - Trees:

    • 一个节点上存储了多个索引元素
    • 节点中数据索引从左到右递增排列
    • 叶节点的指针为空

    B - Trees

    四.Mysql并不是完全使用了B树

    Mysql其实对B树做了些改造,真正的Mysql底层实际上所用到的是B+树(B + Trees)
    B + Trees(B - Trees变种):

    • 非叶子节点不存储data,只存储索引
    • 叶子节点不存储指针
    • 顺序访问指针,提高区间访问性能

    在这里插入图片描述

    五.B + Trees插入过程

            第三节说到B树是对二叉树做了横向上的扩容,会设置一个容量,那么如果要将数据1,2,3,4,5,6,7依次放入最大容量为3的B+树中,它会怎样进行插入。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
            经过上图可以看出B+树的插入是才横向上做文章,一个节点最大容量为3(不能大于等于3),当一个节点的数据容量为3时,它会进行分裂,让其不能大于等于3。
    每个节点递增叶子节点依次递增

            他也符合二叉树的特性,相邻的两个树叉,右边的子元素总是大于等于它的父元素,左边的子元素总是小于它的父元素。
    在这里插入图片描述

    六.使用B+树对数据查询

            不知道大家有没有注意到上图中叶子节点包含我们的所有数据,其实叶子节点是有一种完整的索引元素。非叶子节点把一些中间的元素提取出来做冗余,放到非叶子节点。

            类似一些折半查找,都会把处于中间的元素提取出来做冗余,查找就会更快。

    一般Mysql会把根节点的所有元素放在内存,不需要从磁盘上查找

    比如:要查找的数据为30,30从内存中定位(大于15,小于56),指针经过一次磁盘I/O定位到下一个节点,30继续定位(大于20,小于49),指针进行第二次磁盘I/O定位到30所在节点,总共只进行了两次磁盘I/O,那么它的读取速率是非常快的。
    在这里插入图片描述

    最后给大家推荐一个学习数据结构的网址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

    展开全文
  • mysql 索引底层数据结构: 二叉树:如果是规律性数据,比如1,2,3.....等数据,存储容易成线性结构,数据规模太大之后,查询太慢。 红黑树(hashap的底层数据结构):存在自平衡性问题,虽然不会出现单边增长,...

    索引:是帮助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索引底层数据结构与算法

    万次阅读 多人点赞 2018-10-10 11:10:58
    目录 一 理解索引的特性 二 索引的各种存储结构及其优缺点 ...索引是帮助MySQL高效获取数据的排好序的数据结构 索引存储在文件里 二 索引的各种存储结构及其优缺点 在开始讲这一小节之前,我们先来看一...

    目录

    一 理解索引的特性

    二 索引的各种存储结构及其优缺点

    (一) 二叉树

    (二) 红黑树

    (三) Hash

    (四) B-Tree

    (五) B+Tree(MySQL索引的真正存储结构)

    三. 联合索引底层存储结构


    一 理解索引的特性

    • 索引是帮助MySQL高效获取数据的排好序数据结构
    • 索引存储在文件里

    二 索引的各种存储结构及其优缺点

    在开始讲这一小节之前,我们先来看一下在数据库没有加索引的情况下,SQL中的where字句是如何查找目标记录的。

    我们先看下左边表格第二列Col2列的数据时如何查找的,如果我们希望查找where Col2 = 22的记录,我们在没加索引的情况下是按顺序从第一条记录查找,由此可知需要查找5次才能找到;

    如果对Col2字段加上索引后,我们假设使用最简单的二叉树作为索引存储方式,再次查找where Col2 = 22的记录这次只需要查找2次就能找到目标记录,效率提高十分明显。

    (一) 二叉树

    1. 优点:

    二叉树是一种比顺序结构更加高效地查找目标元素的结构,它可以从第一个父节点开始跟目标元素值比较,如果相等则返回当前节点,如果目标元素值小于当前节点,则移动到左侧子节点进行比较,大于的情况则移动到右侧子节点进行比较,反复进行操作最终移动到目标元素节点位置。

    2. 缺点:

    在大部分情况下,我们设计索引时都会在表中提供一个自增整形字段作为建立索引的列,在这种场景下使用二叉树的结构会导致我们的索引总是添加到右侧,在查找记录时跟没加索引的情况是一样的,如下图所示:

    (二) 红黑树

    1. 优点:

    红黑树也叫平衡二叉树,它不仅继承了二叉树的优点,而且解决了上面二叉树遇到的自增整形索引的问题,从下面的动态图中可以看出红黑树会走动对结构进行调整,始终保证左子节点数 < 父节点数 < 右子节点数的规则。

    2. 缺点:

    在数据量大的时候,深度也很大。从图中可以看出每个父节点只能存在两个子节点,如果我们有很多数据,那么树的深度依然会很大,可能就会超过十几二十层以上,对我们的磁盘寻址不利,依然会花费很多时间查找。

    (三) Hash

    1. 优点:

    对数据进行Hash(散列)运算,主流的Hash算法有MD5、SHA256等等,然后将哈希结果作为文件指针可以从索引文件中获得数据的文件指针,再到数据文件中获取到数据,按照这样的设计,我们在查找where Col2 = 22的记录时只需要对22做哈希运算得到该索引所对应那行数据的文件指针,从而在MySQL的数据文件中定位到目标记录,查询效率非常高。

    2. 缺点:

    无法解决范围查询(Range)的场景,比如 select count(id) from sus_user where id >10;因此Hash这种索引结构只能针对字段名=目标值的场景使用。

    不适合模糊查询(like)的场景。

    (四) B-Tree

    既然红黑树存在缺点,那么我们可以在红黑树的基础上构思一种新的储存结构。解决的思路也很简单,既然觉得树的深度太长,就只需要适当地增加每个树节点能存储的数据个数即可,但是数据个数也必须要设定一个合理的阈值,不然一个节点数据个数过多会产生多余的消耗。

    按照这样的思路,我们先来了解下关于B-Tree的一些知识点:

    • 度(Degree)-节点的数据存储个数,每个树节点中数据个数大于 15/16*Degree(未验证) 时会自动分裂,调整结构
    • 叶节点具有相同的深度,左子树跟右子树的深度一致
    • 叶节点的指针为空
    • 节点中的数据key从左到右递增排列

    1. 树节点结构:

    在这里需要说明下的是,BTree的结构里每个节点包含了索引值和表记录的信息,我们可以按照Map集合这样理解:key=索引,value=表记录,如下图所示:

    2. 优点:

    BTree的结构可以弥补红黑树的缺点,解决数据量过大时整棵树的深度过长的问题。相同数量的数据只需要更少的层,相同深度的树可以存储更多的数据,查找的效率自然会更高。

    3. 缺点:

    从上面得知,在查询单条数据是非常快的。但如果范围查的话,BTree结构每次都要从根节点查询一遍,效率会有所降低,因此在实际应用中采用的是另一种BTree的变种B+Tree(B+树)。

    (五) B+Tree(MySQL索引的真正存储结构)

    在介绍B+Tree之前,我们先来看下面两个问题:

    1. 为什么要对BTree继续做优化?

    要解答这个疑问需要先了解BTree每个节点结构(上面已经说明)和MySQL数据库它是如何读取索引数据的,索引和表数据在不使用的时候是存储在文件中的,也就是磁盘,当我们执行查询操作时会DBMS(数据库管理系统)首先会先从内存中查找,如果找到直接使用,如果找不到则从磁盘文件中读取;操作系统储存数据的最小单位是页(page),一页假设是4K大小(由操作系统决定),对内存和磁盘读取数据是按一页的整数倍读取的。

    这里我们假设数据库一次IO操作就读取1页4K的数据,再假设图中圈起来的元素就是一个大节点,内含多个小节点的索引和数据,其大小是10MB,那么我们要从磁盘中读取完整个大节点需要进行 10M / 4K = 2500次IO操作,这样就可以看出如果大节点数据总量越大,需要执行的IO操作越多,花费的时间也越长,因此为了提高性能,数据库会建议我们一个大节点只存储一页4K大小的数据,这里的数据包含了索引和表记录,另外我们还能计算出树的度Degree应该设置成多大才合理:

    Degree = 内存页大小(4K) / 单个索引值字节大小;

    进一步分析,索引值的大小相对于整条记录的大小是很小的,如果我们需要查找的数据刚好是在最后,那么前面遍历过的节点中存储的记录数据是不是对我们来说是没用的,它会占用比索引大得多的空间,导致我们一个大节点里能遍历的索引数量大大减少,需要向下继续遍历的几率就更大,花费更多时间查找,那么有没有办法可以优化呢?看下一个问题。

    2. 相对于BTree,B+Tree做了哪些优化?

    • B+Tree存储结构,只有叶子节点存储数据

    新的B+树结构没有在所有的节点里存储记录数据,而是只在最下层的叶子节点存储,上层的所有非叶子节点只存放索引信息,这样的结构可以让单个节点存放下更多索引值,增大度Degree的值,提高命中目标记录的几率。

    这种结构会在上层非叶子节点存储一部分冗余数据,但是这样的缺点都是可以容忍的,因为冗余的都是索引数据,不会对内存造成大的负担。

    • 每个叶子节点都指向下一个叶子节点

    这点优化有什么用呢?我们直接看下面的B+Tree结构,如果我们进行范围查找where id > 4的记录,我们只需要先找到id = 4的记录后自然就能通过叶子节点间的双向指针方便地查询出大于4的所有记录。

    三. 联合索引底层存储结构

    单列索引其实也可以看做联合索引,索引列为1的联合索引,从下图就可以看出联合索引的底层存储跟单列索引时类似的,区别在于联合索引是每个树节点中包含多个索引值,在通过索引查找记录时,会先将联合索引中第一个索引列与节点中第一个索引值进行匹配,匹配成功接着匹配第二个索引列和索引值,直到联合索引的所有索引列都匹配完;如果过程中出现某一个索引列与节点相应位置的索引值不匹配的情况,则无需再匹配节点中剩余索引列,前往下一个节点。

    感谢大家的阅读,本文如有错误的地方,希望能私信我改正,共同进步!

    下一篇文章打算介绍两种常见的数据库存储引擎InnoDB和MyISAM

    展开全文
  • MySQL - 剖析MySQL索引底层数据结构

    千次阅读 2020-07-18 16:51:14
    文章目录Pre Pre 什么是索引? 通俗的说就是为了提高效率专门设计的一种 排好序的数据结构。 怎么理解呢? 举个例子哈 如上数据 ,假设有个SQL select * from t where col2 = 22 ;
  • Mysql索引底层数据结构与算法

    千次阅读 2018-10-10 17:25:44
    2,索引底层数据结构与算法 3,索引最左前缀原理   索引到底是什么 •索引是帮助MySQL高效获取数据的排好序的数据结构 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构...
  • 深入理解 MySQL 索引底层原理 Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 Mysql 数据的存储形式以及索引的设计,决定了 Mysql 整体的数据检索性能。 何为索引 ...
  • 【mysql知识点整理】 --- mysql索引底层数据结构

    千次阅读 多人点赞 2020-02-28 12:34:47
    文章目录1 什么是索引 1 什么是索引 索引是帮助MySQL高效的获取数据的数据结构
  • 深入理解Mysql索引底层数据结构与算法

    万次阅读 多人点赞 2018-10-14 20:09:44
    索引是帮助MySQL高效获取数据的排好序的数据结构(容易忽略的点:排好序)(形象点就是教科书的目录) 索引存储在文件里(也就是说有IO操作) 索引结构: 这里说说在几种数据结构中,mysql为什么选择hash,B+...
  • 这就要从索引的本质以及他的底层原理说起。 索引是什么 那索引到底是什么呢?你是不是还停留在大学学『数据库原理』时老师讲的“索引就像字典的目录”这样的概念?老师讲的没错,但没有深入去讲。 其实...
  • 主讲存储结构:https://blog.csdn.net/qq_41618510/article/details/84702890 主讲数据存储:https://blog.csdn.net/qq_41618510/article/details/84702890 主讲存储引擎:https://blog.csdn.net/qq_416...
  • Mysql 底层数据结构,到底是二叉树、红黑树还是B-Tree、还是B+Tree?
  • 索引优化面试题 案例 CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄', `...
  • 索引是帮助数据库高效获取数据的排好序的数据结构。一般的说法索引相当于目录其实并不太准确。 索引是存在硬盘文件里的 数据是如何存储与读取的? 索引采用了什么数据结构呢?        常见的...
  • MySQL联合索引底层数据结构

    千次阅读 2020-06-09 00:55:00
    了解MySQL索引结构的基本都知道索引BTree类型是用B+树的数据结构,单列索引的结构我们很容易理解,二级索引的每个叶子节点只存储主键关键字外的一个数据,查询起来也很容易在非叶子节点进行大小值判断,最终找到叶子...
  • MySQL索引底层数据结构普通索引组合索引 普通索引         普通索引底层就是B+树(B+树的详细规则可参考https://blog.csdn.net/qq_26222859/article/details/80631121)...
  • 深入理解 MySQL 索引底层数据结构

    千次阅读 热门讨论 2021-02-27 23:04:08
    ### 数据结构与算法 #### 二分查找法 #### 二叉查找树 #### 平衡二叉树 #### B+树 ### MySQL索引 #### 索引基础 #### 索引类型 ##### B-Tree索引 ##### 哈希索引 ##### 全文索引 #### 索引的优点 #### 高性能的索引 ...
  • 深入理解Mysql索引底层原理 一步一步推导出Mysql索引的底层数据结构。 Mysql作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是Mysql数据的存储形式以及索引的设计,决定了...
  • MySQL索引的本质,MySQL索引的实现,MySQL索引数据结构
  • MYSQL索引底层数据结构

    千次阅读 2018-07-07 16:34:24
    特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTre...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,629
精华内容 21,451
关键字:

mysql索引底层数据结构

mysql 订阅
数据结构 订阅