mysqlbtree⾯试_java⾯试题:你了解mysql的B+TREE索引
吗?
什么是索引?
索引是为了加速对表中数据⾏的检索⽽创建的⼀种分散储存的数据结构。
⼯作原理:
通过我们建⽴的索引,可以通过命中后的磁盘地址快速的到我们需要的表数据,⽐起全表扫描去查询数据,可以⼤⼤的提升查效率。
在关系型数据库中,索引是硬盘级索引。bootstrap的使用方法
常见的数据结构
1)⼆叉树
⼆叉树相信⼤家都⾮常熟悉,以⼀个节点为根节点,⽐该节点⼩的值⾛左边,⼤的值⾛右边。搜索数据时,只要通过它的数据链接就可到相应的数据。右边为⼀个节点⾥的具体组成部分。
缺点:⼆叉树有个极其致命的缺点,当插⼊数据为顺序递增或顺序递减时,形成的⼆叉树就成了单边
链条。
这样的话,查也没有效率可⾔。
2)平衡⼆叉查树
平衡⼆叉查树作为⼆叉查树的进阶版,改进了⼆叉查树的缺点。
定义:它是⼀棵空树或它的左右两个⼦树的⾼度差的绝对值不超过1,并且左右两个⼦树都是⼀棵平衡⼆叉树。
即,当平衡⼆叉查树数据插⼊时,如果发现形成的树结构违反了它的定义,那么此时树会发⽣形变,组成⼀颗相对平衡的查树。
如果还是以上⾯的1-5顺序插⼊时,形成的树结构为
红⿊树也是平衡⼆叉查树的⼀种实现。
因此不建议对数据频繁变更的列建⽴索引,因为在这个过程中,索引的结构变更必然会带来IO流和CPU的损耗。
缺点:
1.搜索效率不⾜。
因为归根结底还是⼆叉树结构,因此在数据量⼤的时候,树的⾼度极⾼,也就意味着可能⼀次查需要超多次数的IO。
2.节点数据内容太少。
每⼀个节点中保存的数据远远不够填满⼀次内存和磁盘交互的值。如果⼀次内存和磁盘的交互为4KB,那么⼀个节点中保存的数据其实就⼤⼤浪费了这个空间。
3)B tree(多路平衡查树,绝对平衡)
那么B树如何解决平衡⼆叉树的缺点呢?
上图是⼀个三路平衡查树,因为Btree是多路平衡查树的原因,它可以是三路,四路,五路六路,路越多,就意味着树的⾼度越低,那么⼀次搜索的最⼤IO次数也就越少。
实现二叉树的层次遍历
也因为它的多路特性,⼀次IO交互的磁盘块中可能保存着巨⼤数量的节点数据。我们以id为int为例,⼀次IO交互假设为4KB,那么⼀次IO 交互最多能保存1024个关键字!(当然⼀个节点中有数据区和⼦节点引⽤,粗略计算)。
因此我们在设置数据库的字段类型和字段长度的时候,控制字段类型合理,字段长度合理,就能保证每次索引磁盘块的加载能包含更多数据,从⽽提升我们的查效率。mysql面试题sql
4)B+tree(加强版多路绝对平衡查树)
我们还是以三路查树为例
B+树的特点:
⾮叶节点不保存数据相关信息,只保存关键字和⼦节点的引⽤。
所有的数据都保存的叶⼦节点中。
采⽤左闭合区间。
叶⼦节点中的数据顺序排列,并且相邻节点具有顺序引⽤的关系。
B+树相⽐B树的优点:
扫库、扫表能⼒更强
磁盘读写能⼒更强(因为少保存了个数据区)
排序能⼒更强
查效率更加稳定(B树可能⼀次命中,也可能多次命中,⽽B+树因为没有保存数据区的缘故,树的⾼度相对更低,但每次都要查到最多次数)
mysql中B+tree的具体落地形式
myisam
myisam存储引擎的表会有三个⽂件
判断邮箱格式的正则表达式.frm⽂件存储表定义;
·MYD (MYData)⽂件存储表的数据;
.MYI (MYIndex)⽂件存储表的索引。
myisam中的索引结构为平级结构,即id或name索引都会独⽴指向数据地址值。
innodb
innodb存储引擎的表有两个⽂件
.frm⽂件储存表定义;
.ibd储存索引和数据。
innodb是⼀个以主键为索引来组织数据的存储引擎,主键索引形成数据结构,具体的数据值保存在叶⼦节点,⽽辅助索引中的叶⼦节点保
存了指向主⽂件的主键关键字。如果没有指定主键,innodb会⽣成隐藏的6位⾃增列rowid。
索引的⼏⼤原则
最左匹配原则
对索引中关键字进⾏计算和⽐对,⼀定是从左往右⼀次执⾏,且不可跳过。cleartimeout延时函数
⾼离散度原则
列中的数据重复率越低,离散度越好。
最少空间原则
索引的创建原则为 最左匹配 > ⾼离散度 > 最少空间。
联合索引和覆盖索引联合索引
transformer 实战tensorflow单列索引是特殊的联合索引,如果建⽴的联合索引中包含了单列索引及⼩于该范围的联合索引,要注意索引的冗余。(例如:index[id,name]>index[name])
覆盖索引
如果查询的列,通过索引项的信息可以直接返回,则该索引为覆盖索引。
例:table(teacher)index(id)
sql:select id from teacher where id = ?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。