索引数据结构千千万,为什么BTree独领风骚
索引的由来大数据时代谁掌握了数据就是掌握了流量,就是掌握的号召力。面对浩瀚的数据如何存储并非难事, 难点在于如何在大数据面前查询依旧快如闪电! 这时候索引就产生了,索引的产生主要还是借鉴于图书管理员书签的功能。在大数据面前 es 产生了,而我们今天要说的索引却不是它 而是目前中小项目中广泛使用的 mysql 数据库中的索引。本文主题着重介绍索引是什么?索引如何存储?为什么这么设计索引?常见的索引有哪些?最后我们在通过案列来分析如何命中索引以及索引失效的部分场景。 什么是索引
索引是创建在表上的,对数据库表中一列或多列的值进行排序的一种结构,可以提高查询的速度。 索引是一种数据结构,以协助快速查询,更新数据库中的数据 。 mysql 的索引主要由 B+Tree 进行存储。在存储主题上又分为聚簇索引和非聚簇索引。聚簇索引聚簇索引从字面上理解就是聚集在一起。所以凡事索引和数据存放在一起的我们就叫做聚簇索引。在mysql 中 INNODB 的主键索引就是采用的聚簇索引,因为在叶子节点负责存放数据,而非叶子节点负责存放索引。而除了主键索引外其他索引则是非聚簇索引,因为其他索引的叶子节点存储的是主键索引的地址指向。非聚簇索引在 MyISAM 引擎中就是非聚簇索引,我们通过它的文件结构也能够看出索引和数据是分开存放的。 非聚簇索引也会带来一些问题。诸如回表在 INNODB 中非主键索引就是非聚簇索引,同时这种非主键索引也会带来一个问题就是二次索引也称回表。因为我们通过非主键索引是无法定位到最终数据的。大部分情况下我们是需要在根据主键索引进行第二次查找的。加入你有一个索引idx_nameselect name from t where name=13 发生一次索引,不会回表查询select * from t where name=13 发生两次索引,会发生回表上面第一个sql 不会发生回表是因为我门的sql 发生了索引覆盖,意思是idx_name 这颗树已经覆盖了我们查询的范围。索引存储结构先说结论 mysql 中索引是通过 B+ Tree 进行存储的。但是在 mysql 中一开始是采取的 二叉树存储的。关于树形存储结构都是二叉树。那么我们是mysql 中不采用二叉树、红黑树呢?下面我们来分析下采用二叉树、红叉树分别会带来哪些问题。二叉树二叉树是根据顺序在根据大小判断其存储的左右节点的。这就导致如果我们是按递增ID作为索引的话,最终就导致二叉树变成一颗偏向一边的树,换个角度看其实就是链表。
而针对一张表我们往往就是ID作为索引的居多。而ID采用自增策略的居多,所以如果索引采用的是二叉树的,毋庸置疑销量基本无提升,这也是为什么官方放弃 二叉树 作为索引存储的数据结构。而二叉树一共有如下几种极端情况
平衡二叉树在开始红黑树之前,我们需要先了解下有种临界状态叫平衡二叉树。平衡二叉树又叫做Self-balancing binary search tree 。 平衡二叉树是二叉树的一种特例在二叉树中有一个定义平衡度(平衡因子)的概念。他的公式是左右高度的绝对值。当这个平衡度<=1的时候我们就称之为平衡二叉树在平衡二叉树中他的高度是最稳定的,换句话说平衡二叉树和其他二叉树相比能够在相同的节点情况下保证树的高度最低;这也是为什么mysql中索引的结构是一种平衡二叉树的升级版
红黑树
红黑树实际上是一颗平衡二叉树;所以在构建的过程中他会发生自平衡
因为二叉树在极端的情况会变成一个链表,针对链表的问题红黑树的自平衡特性就完美的规避了二叉树的缺点。那么为什么最终索引也不是选择红黑树呢?仔细观察能够发现红黑树是一颗标准的二叉树。他所能容纳的最大节点数和他的高度正好成二的次方这个关系。也就是说假设红黑树的高度是h ,那么他能容纳最多的节点为 2^h。这样看来在数据量过大时,通过红黑树去构建貌似这颗二叉树高度就过去庞大了。高度也高给我们查询就带来更多次交互。要知道每个节点都是存储在硬盘中的,那么每一次的访问都会带来一次IO消耗。所以为了能够提高查询效率 mysql 最终还是没有选择红黑树。
①、每个节点要么红色要么黑色
②、根节点是黑色的
③、叶子节点是黑色的
④、红色节点的子节点一定是黑色的
⑤、从一个节点出发,到达任意一个叶子结点(NULL)路径上一定具有相同的黑色节点(保证了平衡度<=2)
BTree
BTree的设计主要是针对磁盘获取其他存储的一种平衡树(不一定是二叉这里往往指的是多叉)
B树非常适合读取和写入相对较大的数据块(如光盘)的存储系统。它通常用于数据库和文件系统。总结下BTree 具有如下特点:
①、至少是2阶,即至少有两个子节点 ②、对于m阶BTree来说,非根节点所包含的关键词个数j需要满足 (m/2)-1<=j<=m-1 ③、除叶子结点外,节点内关键词个数+1总是等于指针个数 ④、所有叶子结点都在同一层 ⑤、每个关键字保存实际磁盘数据B+Tree
B+Tree 是BTree的一种变体。BTree节点里出了索引还会存储指针数据,而B+Tree仅存储索引值,这样同样空间节点能够存储更多的索引 B+Tree 因为压缩了数据存储空间,这样就能够在相同高度的BTree上存储更多的索引,这样更加提高索引定位销率。
Hash表
①、hash索引无法进行范围查询,因为上述的hash结构是没有顺序的,hash索引只能实现等于、In等查询 ②、hash值是针对元数据的一种散列运算。hash值得大小并不能反应元数据的大小。元数据a 、b对应的hash值有可能是3333、2222,而实际上上a
春晚看点多!秦岚落泪嗓子哑,马丽炸毛,撒贝宁穿高跟赢麻了爆竹声中一岁除,春风送暖入屠苏。在全国观众的期待下,2023兔年春晚已经拉开了帷幕,每个节目都充满了年味儿和欢声笑语。不出意外,每年都是大型的真香现场,那么今年春晚都有哪些看点呢?
正月初五破五节,牢记1不出,2要做,吃3样,忌2事,送穷迎吉祥天南地北大拜年导读我一直觉得,初一到初三才能称之为大年,到了初三之后,应该称之为正月,现在说的初五,也就是正月初五,俗称破五。到了这个时间段,我们就应该好好准备一下,开始踏上返程的
东北的丈母娘来了女婿很着急张先生家有台美菱冰箱,他反映,最近制冷功能突然坏了,怕是要等到年后才能修好。1818黄金眼一家子留杭过年冰箱坏了能否提供备用张先生上周三左右,因为我们冰箱有很多包好的饺子和面条之类
狂飙红颜祸水,大佬的女人陈书婷,才是强哥黑化的催化剂花煜寒文此文为花煜寒对狂飙电视剧人物剧情的解读,每一期涉及不同的人物与剧情,如果喜欢的话,请右上角点关注文接上回。还记得那一夜吗?强哥被一个艳丽的女人勒着脖子差点挂掉,还流下了痛苦
大年初四,快来迎灶神扔穷!今天是大年初四按照传统习俗是家家户户迎灶神的日子人们往往在这一天选择在家中团聚灶神又叫灶王灶君灶王爷是中国古代神话传说中的司饮食之神传说中的灶神体态臃肿圆滑世故掌管着一家人的财气祸
Dunk海盐蓝成2023首匹黑马!3招教你如何避雷!兔年到了,你是否穿上了自己喜欢的新鞋了呢?最近,小编发现,得物上有一双很火的鞋NikeDunkLowIvoryHyperRoyal白蓝配色,不仅有2。7万名得物er已经入手,更有6
POP流行趋势网风衣女装TOP款式热搜排行榜综述报告数据基于7月份用户下载互动数据榜单TOP100,其中新锐设计占据大部分比率,设计点上环绕这解构拼接荷叶边装饰等工艺应用,应用帽口延长浮水等部位塑造出披肩视觉的风衣比率12,
DIOR用一场高订秀告诉我们WhoisJosephineBaker在一群花花绿绿夸张廓形的高订发布秀中,DIOR如一股清流出现在大众视野中。正如DIOR女装创意总监MariaGraziaChiuri所说,这一高订系列是奢华20年代的当下演绎,更干
一个吃过大苦的人,会有以下五个表现,值得尊重和学习作者拾壹言01序言每个人的一生,都不是一帆风顺的,吃过苦的人会变得更加坚强和努力。对于每个人来说,吃过苦之后,都会有不同程度的变化和成长。在人生的道路上,吃过苦,才知道什么是真正的
不要试图改变任何人不要试图改变任何人,也不要指望身边的人会因为你而改变。他们只会因为你的口袋而自动改变。成年人的世界就一条准则,利益面前,先小人后君子。永远别替别人做决定不然到时候背锅的人可就是你了
年是我的劫像我这样逃避过年的人,应该没谁了吧?来头条看看别人的快乐,心里算算假期还剩下好几天。小时候逃避过年,是害怕父母的争吵,虽然平时也吵,但过年更凶。现在逃避过年,是害怕这种孤独的冷漠,