数据库索引真正的工作原理

导航到

我对数据库产生了浓厚的兴趣,这让我对它们的工作原理提出了很多问题,而最近我痴迷的是数据库索引。

以前,我知道如果想使特定的列或字段比其他列或字段更快,我就给它创建索引。这是我刚开始学习编码时大脑能处理的极限,但作为开发者的成长意味着要扩展我们对基础知识的了解,比如数据库索引究竟是什么以及为什么它存在。

<figcaption> 作为开发者有很多成长方式 </figcaption>

什么是数据库索引?

想象我们在旧金山街头寻找我们的朋友Chris。我们知道她住在旧金山,但不知道她的地址。虽然每座建筑都有一个独特的地址,使我们能轻松找到它,但我们需要一种方式将我们要找的人,Chris,与她的独特地址联系起来。在这种情况下,我们必须敲遍旧金山的每一扇门,直到找到她。这并不高效(可能也不是一个好主意)。但如果我们有一个将Chris与她地址123 Nunya Lane联系起来的目录,我们就可以直接走到那里。

这就是数据库索引的原理。数据库索引是一种数据结构,就像数组或哈希表。这只是我们组织数据的一种方式。在这个例子中,我们将有一个指向地址的名录索引。

<figcaption> 你永远不知道谁会在旧金山开门 </figcaption>

那么,为什么在我们的数据库中需要一个数据结构,而数据库本身就是一个大数据结构呢?

为什么数据库需要索引?

我们在数据库中存储了大量的信息——从用户凭证到我们家中送来的披萨的纬度和经度,应有尽有。没有索引,数据库就像在旧金山敲门一样,或者以线性方式搜索每一项记录。有时,这可以正常工作。然而,一些数据库存储了数亿条记录,因此线性搜索可能需要10步、525,600步或3亿步。我们必须考虑可能需要走的步数。没有索引,数据库在搜索每一项记录以找到匹配项时可能会变得非常慢,这可能导致等待查询的积累。延迟和整体响应时间会增加,等待查询结果的人要么得找点爱好,更可能的是,使用不同的应用程序。

应该索引什么?

当我们决定给数据库添加索引时,我们需要考虑我们的数据。对每个列或字段进行索引也可能有负面影响。如果我们创建十个索引,向数据库写入单个记录就会变成11次写入:一次写入数据库,一次写入每个索引(假设该记录包含所有索引列/字段)。作为一个指导原则,我们想要索引那些最常被查询的数据。写入索引的成本可以通过提高大量数据库查询的性能来抵消。

关系型数据库索引和非关系型数据库索引有什么区别?

在关系型数据库中,索引是按列创建的。我们可以选择任何列,甚至是一组列来创建索引。

非关系型数据库也可以有索引!由于数据库种类繁多,在非关系型数据库的世界中,规范远不如关系型数据库,但大多数数据库都有优秀的文档,介绍如何索引数据。我喜欢InfluxDB的索引,其中插入作为标签的数据会进行索引,而插入作为字段的数据则不会,所以如果我不想过多思考索引问题的话,可以不用考虑太多。

摘要

数据库索引是我们理解数据库如何花费时间和资源的基本部分,创建它们促使我们更深入地了解我们的应用程序和它们产生的数据。我感觉自己变得更聪明了。