索引原理(平衡树数据结构)黑白键盘

本质:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据

想要了解索引的原理就必须了解一种数据结构——平衡树(b tree或b+ tree),也有写索引是用哈希桶作为其数据结构,但是主流的RDBMS都是把平衡树作为默认的索引存储结构

这里的平衡树,类似我们熟悉的二叉树,但不等于二叉树,存储结构也是有根节点,叶结点,真正的数据只存在叶子结点上,其他非叶子结点只存储指引搜索的方向。事实上,创建表时如果未指定主键,则数据无序地放置在磁盘存储器上,一列一列很整齐地存放着,但是没有规律,如果指定了主键,数据存储结构立刻变为树状结构,也就是所说的平衡树结构,同时生成了一个聚集索引,这就是为什么一个表只能有一个主键, 一个表只能有一个聚集索引,因为主键的作用就是把表的数据存储格式转换成索引(平衡树)的格式放置。

例如这条SQL语句:

select * from kxf where id=20;

首先根据索引定位到20这个值所在的叶结点,然后再通过叶结点取到id等于20的数据行。 这里不讲解平衡树的运行细节, 但是树有多少层, 从根节点至叶节点就只需要经过多少次查找就能得到结果,这里树有三层,也就是说只需要三次IO,如下图

假如一张表有一亿条数据,需要查找其中某一条,按照常规逻辑,一条一条的去匹配的话,最坏的情况下需要匹配一亿次才能得到结果,时间复杂度就是O(n),这显然无法接受,而且这一亿条数据显然不能一次性读入内存供程序使用,因此,这一亿次匹配在不仅缓存优化的情况下就是一亿次IO开销,以现在磁盘的IO能力和CPU运算能力,有可能需要几个月才能得出结果。如果把这张表转换成平衡树结构,假设这棵树有10层,那就只需要10次IO开销就能查找到数据,速度以指数级别提升。

所以假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。

讲完聚集索引,接下来说一下非聚集索引,也就是我们平时经常用到的常规索引

非聚集索引和聚集索引一样, 同样是采用平衡树作为索引的数据结构。索引树结构中各节点的值来自于表中的索引字段, 假如给user表的name字段加上索引 , 那么索引就是由name字段中的值构成,在数据改变时, DBMS需要一直维护索引结构的正确性。如果给表中多个字段加上索引 , 那么就会出现多个独立的索引结构,每个索引(非聚集索引)互相之间不存在关联。

非聚集索引和聚集索引的区别在于,通过聚集索引可以直接查找到所需要的数据,而通过非聚集索引可以查找到记录对应的主键,然后再通过聚集索引查找到所需要的记录,查找步骤如下图:

无论采用哪种方式查询表,最终都会通过聚集索引来定位数据,聚集索引(主键)是通往真实数据所在的唯一路径。

然而, 有一种例外可以不使用聚集索引就能查询出所需要的数据, 这种非主流的方法 称之为覆盖索引查询, 也就是平时所说的复合索引或者多字段索引查询。 文章上面的内容已经指出, 当为字段建立索引以后, 字段中的内容会被同步到索引之中, 如果为一个索引指定两个字段, 那么这个两个字段的内容都会被同步至索引之中。

先看下面这个SQL语句

//建立索引

create index index_birthday on user_info(birthday);

这句SQL语句的执行过程如下

然后,通过得到的主键ID值执行聚集索引查找,找到主键ID值对就的真实数据(数据行)存储的位置

最后, 从得到的真实数据中取得user_name字段的值返回, 也就是取得最终的结果

我们把birthday字段上的索引改成双字段的覆盖索引

create index index_birthday_and_user_name on user_info(birthday, user_name);

THE END
0.MySQL索引与页结构页结构图 图示说明: 1111a,分别表示col1,col2,col3,col4,col5 五列数据。红色标记为以主键构造的主键索引,也为聚簇索引。 用户数据区:数据为链表结构,对于链表结构而言,插入性能较高,而查询性较低,因此这个链表的长度不会很长,那么mysql是怎么解决这个问题的呢?当然是通过页目录来解决。 jvzquC41dnuh0lxfp0tfv8|gkzooa=95::<9;8ftvkimg8igvcomu86487=54:8
1.国内超大索穹顶张拉完成,坚朗自主研发智慧索首次应用特别是,光纤光栅智慧索凭借监测精度高、量程大、耐久性好、抗电磁干扰、信号容量大和损耗小的优点,首次被成功应用于三个场馆中,开启国内索结构体系健康监测的新纪元。 坚朗五金自2018年项目设计之初,便积极参与建筑方案选型、结构参数设计、张拉施工模拟分析、节点深化设计等全链条工程配合,并持续加大自主研发力度,开发出jvzquC41fyixd7hqo1tfy|nphq537=57494ivvq
2.珠江科学大讲堂第121讲:中国天眼与南仁东的故事如何建设?柔性网索结构实现反射面变位 姚蕊还介绍说,在20世纪90年代,中国已有的射电望远镜最大直径仅有25米,而美国的Arecibo射电望远镜经过扩建后直径达到了350米。而直径越大,射电望远镜的灵敏度则越高,灵敏度直接决定了能“看到”多暗的信号。因此,如果我们想看到别人看不到的信号,就要建直径更大的射电望远镜。jvzquC41pg}t0‚hyd0ipo872463168761euovnsva7876<6970nuo
3.岗位上的坚守!“五一”施工不打烊他们坚守在一线抢工期荆楚网五一期间,由中建八局东北公司承建的大连梭鱼湾足球场项目仍是机械轰鸣、一派繁忙景象。目前,项目建设者们经过177天努力施工,在昨天上环索提升、撑杆安装、拉索提升、交叉索施工的目标如期完成。 中建八局东北公司大连梭鱼湾专业足球场项目经理 么德生:今天我们完工的是体育场屋面罩棚索结构体系,是本工程最为重要的分项jvzq<84pgyy/ewmwdgo/exr1eqtugwy14283/9:1245dqwygpve26@6742;/j}rn
4.索引的原理·数据库·看云索引是一种利用某种规则的数据结构与实际数据的关系加快数据查找的功能;索引数据节点中有着实际文件的位置,因为索引是根据特定的规则和算法构建的,在查找的时候遵循索引的规则可以快速查找到对应数据的节点,从而达到快速查找数据的效果;其实宏观来说索引其实是一种概念而不是具体的某项技术,只是我们在某个技术中运用得比jvzquC41yy}/mjsenq{e0ls1htkzc9531fguckfug182:B<66
5.土木工程学院主要从事大型复杂土木工程结构分析和施工技术的教学和科研工作,致力于大跨空间预应力索结构的分析、设计、施工和测试技术及工程应用的研究,主持和参与的科研项目有:科技部“应用于FAST反射面闭环控制的实时仿真系统”、“基于塔架提升索杆累积安装的索穹顶施工关键力学分析和技术研究”和“基于向量式有限元的预应力空间结构jvzquC41ek|jn7xgw0kew7hp1nh0nrxv0jzn
6.LiuHongbo本科生课程《通用结构分析软件》 本科生课程《现代预应力结构》 研究生课程《大跨度建筑结构体系》 主要学术兼职: 1) 中国钢结构协会 理事 2) 中国建筑金属结构协会铝结构分会 秘书长 3) 中国钢结构协会结构稳定与疲劳分会 理事 4) 中国钢结构协会空间结构分会索结构专业委员会 委员 jvzq<84liz/vsz0gf{/ew4kphu03:9;14=777mvo
7.《MySQL高级篇》四索引的存储结构mysql索引存储结构《MySQL高级篇》四、索引的存储结构 本文详细解析了数据库索引的原理,包括B+树的构建与优化,聚簇索引与非聚簇索引的区别,以及MyISAM和InnoDB存储引擎的索引实现。讨论了索引的优缺点,指出索引在提高查询效率的同时,也会增加存储空间和维护成本。此外,还提到了哈希索引和R树等不同类型的索引结构及其适用场景。最后,强调了合理选择数 jvzquC41dnuh0lxfp0tfv8fufhgecoi1ctzjeuj1fgzbkux134<16;>23
8.sql索引的介绍以及使用规则详析Mysql3。如果表没有主键,或没有合适的唯一索引,则 InnoDB 会自动生成一个 rowid 作为隐藏的聚集索 引。 聚集索引和二级索引的具体结构如下图所示。 聚集索引的叶子节点下挂的是这一行的数据 , 二级索引的叶子节点下挂的是该字段值对应的主键值。 执 行如下的 SQL语句时,具体的查找过程如下所示。 具体过程如下: 1jvzquC41yy}/lk:30pku1jwvkerf1;<;;6:/j}r