首页 > 其他分享 >Innodb索引数据结构灵魂拷问

Innodb索引数据结构灵魂拷问

时间:2023-11-13 10:44:19浏览次数:39  
标签:Key 拷问 索引 Innodb IO 数据结构 主键 加载

问题1:Innodb数据结构为什么要用B+树,如果比红黑树要好的话,为什么Java HashMap不用B+树而用红黑树?

如果数据全在内存的话,红黑树要比B+树好,查找次数比B+树要少很多,B+树适合磁盘IO,因为一次IO可以加载很多节点数据,查找次数虽多但IO次数少。红黑树是瘦长的,B+树是矮胖的。IO的次数取决于树的高度。

问题2:为什么IO的次数要取决于树的高度,我一次IO多加载几层不一样可以少些IO吗,必须得一层层加载到内存?

因为Innodb是把一页的数据放在同一高度的,一次IO加载一页,只能一层层加载,就是这么设计的,然后在这个设计基础上,当然是每层的数据填满页,即把树变胖,高度变矮IO次数会更少。

问题3:为什么不用B树?

因为B树的非叶子节点也不光有索引的Key还有Data,那一次IO加载的一页数据16K中的索引Key就要少很多,那这势必要更多次IO才能加载出所需的索引Key了。所以应该把非叶子节点的Data去掉,把空间让给索引Key。

问题4:为什么默认不用Hash索引?

仅支持=,in查询。
索引冲突多的话,相同hash的数据是链表的线性结构,查找起来也不快。

问题5:为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?

1.为什么要有主键?
如果不建主键,MySQL会帮我们选一个非空唯一列来当主键组织聚簇索引,如果没有则建一个隐藏列rowid当主键。这就强加了一些工作给MySQL,没必要。并且如果选择出来的非整型自增字段作主键性能也不好。

2.为什么要整型?
查找时比较大小更快

3.为什么要自增?
避免插入时增加维护聚簇索引的开销。
如果使用自增主键:
那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,主键的顺序按照数据记录的插入顺序排列,自动有序。当一页写满,就会自动开辟一个新的页。
如果使用非自增主键(如身份证号或学号等):
由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。

Refrence: https://blog.xxmoon.com

标签:Key,拷问,索引,Innodb,IO,数据结构,主键,加载
From: https://www.cnblogs.com/beeboo/p/17828654.html

相关文章

  • 数据结构与算法 | 记忆化搜索(Memorize Search)
    在本系列的文章中已经写了二叉树(BinaryTree)、深搜(DFS)与广搜(BFS)、哈希表(HashTable)等等,计划接下来要写的是动态规划(DynamicProgramming,DP),它算得上是最灵活的一种算法。回忆笔者学习动态规划的时候,最开始接触的是经典的“01背包”问题;不过现在想起来,以“01背包问题”作为初次......
  • innodb存储引擎了解
    mysql常用的存储引擎分为innodb和myisam其中innodb具有支持事务,执行行级锁,支持MVCC,外键,自动增长列,崩溃恢复等特性。并且mysql在5.5.5之后是数据的默认存储引擎文件:mysql的数据都存放的data文件中,其中日志文件包括错误日志,慢查询日志,查询日志还有二进制日志慢查询日志默认时间......
  • 历时三年,写的一本数据结构与算法pdf,开源了!
    前言大家好,我是bigsai,很早就在写博客,将文章整理成了一个pdf,并且开源到github上!自己写东西断断续续也不少时间了,也写了不少东西(虽然是偏向小白),这个其实花费的时间还是比较多的,这次的话主要将数据结构与算法中一些文章整理出来,初步整理成一版pdf,先分享给大家。因为在整理pdf方......
  • 数据结构之树(树转化为二叉树也叫二叉化)
    说明对于将一般树结构转化为二叉树,使用的方法称为“Child-Sibling”(Leftmost-child-next-right-sibling)法则。步骤1.将节点的所有兄弟节点,用横线连接起来2.删掉所有与子节点间的链接,只保留与最左子节点的链接3.顺时针旋转45度 二叉树转化为多叉树与树转化为二叉树......
  • 数据结构之树(线索树)
    线索二叉树二叉树有些节点没有左子树或没有右子树或左右子树都没有,那么就会存在空链接的情况,为了充分利用空链接,让其指向树的其他节点,这些指向其他节点的链接就是线索,这棵树也变成了线索二叉树。二叉树变成线索二叉树的步骤1.二叉树先根据中序遍历的方式,进行排序(这样节点就直......
  • Redission实现公平锁为什么要使用ZSet数据结构?
    Redission实现公平锁为什么要使用ZSet数据结构?使用ZSet结构有什么好处?看lua代码好像也并没有使用到ZSet的二分查找这种优势,在Redisson中实现公平锁时使用ZSet(有序集合)数据结构有以下几个好处:具有排序功能:ZSet是有序的数据结构,其中的每个元素都有一个分数(score)与之相关联。这使得R......
  • JavaSEday05 泛型,数据结构,List,Set集合
    javSEday05泛型,数据结构,List,Set今日目标泛型使用数据结构ListSet1泛型1.1泛型的介绍泛型是一种类型参数,专门用来保存类型用的最早接触泛型是在ArrayList,这个E就是所谓的泛型了。使用ArrayList时,只要给E指定某一个类型,里面所有用到泛型的地方都会被......
  • JavaSE day05【泛型,数据结构,List接口,Set接口】测评题
    选择题题目1(单选):查看下列代码,选出正确的传参()publicclassTest2{publicstaticvoidmain(String[]args){ArrayList<Integer>list1=newArrayList<Integer>();ArrayList<Number>list2=newArrayList<Number>();Arr......
  • 一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)
    请问以下JS代码的执行结果是什么?functioncontrol(x){if(x==3)thrownewError("break");}functionfoo(x=6){return{next:()=>{control(x);return{done:!x,value:x&&x--};}}}letx=newObject;x[Symbol.......
  • 数据结构之树(二叉排序树)
    特点二叉排序树(BinarySearchTree,BST)的特点:每个节点最多有两个子节点,分别称为左子节点和右子节点。节点的左子树中的所有节点的值都小于该节点的值。节点的右子树中的所有节点的值都大于该节点的值。左子树和右子树也分别是二叉排序树。BST的主要优点是可以实现高效的查......