数据库索引是后端开发人员用来优化数据库查询的最常用方法。在本文中,我们将详细讨论数据库索引。
数据库索引允许查询以有效的方式从数据库中检索数据。简而言之,索引是一种将无序表排序的方法,可以在搜索记录时最大限度地提高效率。
索引可以与特定的表相关,并由一个或多个键组成。此外,一个表可以有多个从中构建的索引。
当数据库表没有索引时,行的顺序是不明确的,因此,要完成任何查询,都需要线性搜索行,即查询必须搜索每一行才能找到符合条件的行。正如您可以想象的那样,这并不理想,并且在查看包含大量数据的数据库表时可能会成为问题。
例如,我们有一个如下所示的表:
COMPANY_ID | 单元 | 单位成本 |
---|---|---|
10 | 12 | 1.15 |
12 | 12 | 1.05 |
14 | 18 | 1.31 |
18 | 18 | 1.34 |
11 | 24 | 1.15 |
16 | 12 | 1.31 |
10 | 12 | 1.15 |
12 | 24 | 1.3 |
18 | 6 | 1.34 |
18 | 12 | 1.35 |
14 | 12 | 1.95 |
21 | 18 | 1.36 |
12 | 12 | 1.05 |
20 | 6 | 1.31 |
18 | 18 | 1.34 |
11 | 24 | 1.15 |
14 | 24 | 1.05 |
然后,我们要运行如下查询:
SELECT company_id, units, unit_cost FROM index_test WHERE company_id = 18
在这种特殊情况下,数据库必须按照它们在表中出现的顺序搜索所有 17 条记录,从上到下,一次一条,以查找company_id
为 18 的所有潜在实例。
随着表格大小的增加,这只会变得越来越耗时。索引如何在这里提供帮助?索引可以帮助我们以排序的方式设置搜索条件为on(本例中为company_id
)的列,以优化查询性能。
使用company_id
列上的索引,该表将如下所示:
COMPANY_ID | 单元 | 单位成本 |
---|---|---|
10 | 12 | 1.15 |
10 | 12 | 1.15 |
11 | 24 | 1.15 |
11 | 24 | 1.15 |
12 | 12 | 1.05 |
12 | 24 | 1.3 |
12 | 12 | 1.05 |
14 | 18 | 1.31 |
14 | 12 | 1.95 |
14 | 24 | 1.05 |
16 | 12 | 1.31 |
18 | 18 | 1.34 |
18 | 6 | 1.34 |
18 | 12 | 1.35 |
18 | 18 | 1.34 |
20 | 6 | 1.31 |
21 | 18 | 1.36 |
现在,数据库可以简单地搜索company_id
等于 18 并返回该行的所有请求列,然后移动到下一行。如果下一行的company_id
又为18,那么它也会返回该行的请求列,但是如果下一行的company_id
为18,则数据库知道可以在这里停止搜索,并完成响应.
这是对数据库索引是什么以及它们可以做什么的一个相当简单的解释,但在这个过程中还有很多事情要做。让我们更深入地了解索引是如何工作的。
实际上,数据库表不会在每次查询条件改变时重新排序以优化数据库性能,但实际上发生的是索引使数据库创建了一个单独的数据结构,该结构应该易于排序。
重要的是要注意,当在数据库中的列上创建索引时,它会在该特定列上创建一个数据结构,并且没有其他列存储在该数据结构中。例如,在上面的示例中,我们的数据结构将只包含company_id
而没有其他列,例如unit
或unit_cost
。
但是这里出现了一个合法的问题 - 数据库如何知道要为查询返回表中的其他字段。让我们尝试了解如何。
数据库索引存储指针,以简单地引用内存中附加信息的位置信息。换句话说,索引在内存中保存company_id
和该特定行的地址。在此示例中,数据库索引将如下所示:
COMPANY_ID | 指针 |
---|---|
10 | _123 |
10 | _129 |
11 | _127 |
11 | _138 |
12 | _124 |
12 | _130 |
12 | _135 |
14 | _125 |
14 | _131 |
14 | _133 |
16 | _128 |
18 | _126 |
18 | _131 |
18 | _132 |
18 | _137 |
20 | _136 |
21 | _134 |
使用该索引,查询可以检查company_id
列中值为18 的行,然后使用指针查找该记录的相关信息。
了解了我们对索引的期望之后,让我们看一下可用于数据库索引的常见数据结构:
B 树是最常用的索引数据结构,因为它们的查找、删除和插入速度很快。所有这些操作都可以在对数时间内进行,并且可以轻松地对 B 树中包含的数据进行排序。
哈希索引通常用于描述利用哈希表的索引。由于哈希表在查找数据方面特别有效,因此可以快速处理查找完全匹配的查询。哈希索引中的键是列值,而哈希表中的值是对表行数据的引用。
另一方面,哈希表不是有序的数据结构。因此,它们对于其他类型的搜索可能效率低下。
R-tree在空间数据库中经常使用,通常用于索引地理坐标、矩形、多边形等多维信息。对于诸如“查找我所在位置2英里内的所有咖啡店”等搜索很有用。
位图索引对于此类值出现次数较多的列很有用,即选择性较低的列。例如,考虑一个具有布尔值的列。
索引旨在提高数据库性能;因此,只要我们需要显着提高数据库性能,就可以使用索引。您的数据库扩展得越大,索引就越有可能使您受益。
但是,首先要记住的是索引占用了额外的空间;因此,表越大,索引越大。每次执行添加、删除或更新操作时,也需要对索引执行相同的操作。
当数据写入数据库时,首先更新原始表,然后是基于该表的其他索引。对数据库进行写入后,索引在更新之前将无法操作。如果数据库不断获得写入,索引将永远无法正常工作。
这就是为什么索引通常应用于按计划(在非高峰时段)获取新数据的数据仓库中的数据库,而不是可能一直接收新写入的生产数据库。
以下代码片段显示了如何在 SQL 数据库中的单个列上创建索引:
CREATE INDEX name_index ON Employee (Employee_Name);
如果要在多个列上创建索引,SQL 命令将如下所示:
CREATE INDEX name_index ON Employee (Employee_Name, Employee_Age);
一般来说,只有当索引列中的数据会被频繁访问时,才应该在表上构建索引。
因此,我们在本文中详细讨论了数据库索引,还了解了用于实现数据库索引的数据结构以及何时建议使用索引等。
总结一下,这里是一个快速的总结:
这就是本文的全部内容。数据库索引是一个庞大且有点复杂的主题,我希望这篇文章有助于理解这个概念的基础知识。
继续阅读!