数据库索引的真正工作原理
作者:Katy Farmer / 产品, 用例
2018 年 10 月 08 日
导航至
我对数据库的热爱日益增长,这促使我问了很多关于它们如何工作的问题,而我最近痴迷的是数据库索引。
以前,我知道如果我想要让特定的列或字段比其他列或字段更快,我就对其进行索引。那是我刚开始学习编码时大脑能够处理的全部内容,但是作为一名开发人员的成长意味着扩展我对基础知识的了解,例如数据库索引到底是什么以及它为什么存在。
<figcaption> 作为开发人员,有很多种成长方式</figcaption>
什么是数据库索引?
想象一下,我们正在旧金山寻找我们的朋友 Chris。我们知道她住在旧金山,但我们不知道她的地址。虽然每栋建筑都有一个唯一的地址,使我们能够轻松找到它,但我们需要一种方法将我们要找的人 Chris 与她的唯一地址联系起来。在这种情况下,我们必须敲旧金山的每一扇门,直到找到她。这效率不高(而且可能不是一个好主意)。但是,如果我们有一个目录将 Chris 与她的地址 Nunya Lane 123 号联系起来,我们就可以直接走到那里。
这与数据库索引的原理相同。数据库索引是一种数据结构类型,例如数组或哈希。这只是我们组织数据的一种方式。在本例中,我们将有一个名称索引,指向地址。
<figcaption> 你永远不知道在旧金山谁会来开门</figcaption>
那么,为什么我们需要数据库内部的数据结构,要知道,数据库本身就是一个大的数据结构?
为什么数据库需要索引?
我们在数据库中保存了太多东西——从用户凭据到送到我们家的披萨的经纬度,几乎任何我们认为以后可能需要的东西。如果没有索引,数据库就会像在旧金山敲每一扇门一样,或者以线性方式搜索每个记录。有时,这可以正常工作。但话又说回来,有些数据库存储了数亿条记录,因此线性搜索可能需要十步、525,600 步或 3 亿步。我们必须考虑潜在的步数。如果没有索引,数据库在搜索每个记录以查找匹配项时可能会导致查询速度极慢,这可能会导致等待查询的堆积。延迟和整体响应时间将会增加,任何等待这些查询结果的人要么必须找点爱好,要么更有可能使用不同的应用程序。
应该索引什么?
在决定向我们的数据库添加索引时,我们需要考虑我们的数据。索引每个列或字段也可能产生负面影响。如果我们创建十个索引,则将单个记录写入数据库会变成 11 次写入:一次写入数据库,一次写入每个索引(假设该记录包含所有索引列/字段)。作为指导原则,我们希望索引查找频率最高的数据。写入索引的成本被我们大量数据库查询的性能改进所抵消。
关系数据库索引和 NoSQL 数据库索引之间有什么区别?
在关系数据库中,索引按列创建。我们可以选择任何列甚至列的组合来创建我们的索引。
NoSQL 数据库也可以有索引!由于数据库种类繁多,非关系数据库的世界中几乎没有约定俗成的东西,但它们中的大多数都有关于如何索引数据的优秀文档。我喜欢 InfluxDB 的索引,其中作为标签插入的数据会被索引,而作为字段插入的数据则不会被索引,因此如果我不想考虑索引,我无需考虑太多。
总结
数据库索引是理解我们的数据库如何花费时间和资源的基础部分,创建它们鼓励我们更多地了解我们的应用程序及其生成的数据。我已经感觉更聪明了。