系统设计,第5章:数据库索引

聚簇与非聚簇,聚簇索引,非聚簇索引,聚簇和非聚簇索引

在此博客中,我们将研究后端工程师如何处理从数据库中快速检索记录。

让我们尝试以简单的角度来理解事物是如何工作的以及什么是集群索引和非集群索引。

集群索引

我们都已经看到了座机时间,以前我们在家里有电话簿,每当需要任何数字时,我们都需要按字母顺序查找并找到所需的数字,也就是说,您知道什么是集群索引。
电话簿(单个参考—按字母顺序)—组织数据

集群表的最大优点之一是,数据是通过存储子系统中的集群键进行物理排序的。 您可以将“聚簇表”与传统电话簿进行比较:电话簿按姓氏聚类/排序,这意味着Abhishek的姓氏在Tarun之前,而Tarun在Umesh之前。 因此,聚簇表与没有物理排序顺序的堆表完全不同。

让我们尝试通过一些图表来了解集群如何在后端工作。

下面是使用群集索引的员工数据库的示意图。

非聚簇索引

我们从上学的时候就知道了这一点,当时我们过去经常看书的索引,并且能够从书的最后一个主题索引或书的索引中找出哪个页面需要寻找哪个主题。

“最后一本书”(索引参考)-基于页面的内容-多个主题可以具有相同的索引。

聚集索引节省了我们必须在非聚集索引中执行的其他I / O操作,以获取行数据。 这是因为完整的行数据驻留在聚簇索引叶块中,而只有行定位符存储在非聚簇索引叶块中。 因此,我们保存了一个额外的I / O来到达该行。

这表明使用聚簇索引的点查找通常比非聚簇索引更快。 对于UNIQUE和NON-UNIQUE索引类型都是如此。

同样, 在范围扫描的情况下,聚集索引将更快 。 如果扫描恰巧检索大量数据,则群集索引和非群集索引之间的性能差距可能非常大。

缺点:

  • 在非聚集索引上查找会变得很昂贵。 假设在A列上有一个聚集索引,在B列上有一个非聚集索引。一旦在B列的键值上探测了非聚集索引,我们将从叶子中获得聚集索引键(A列)的值。块。 然后,使用列A的索引键值来探查聚簇索引(这也是B树遍历),并从聚簇索引的叶块中获取相应的行。
  • 每次更新聚类密钥时,由于非聚簇索引存储聚类密钥,因此也需要对非聚簇索引进行相应的更新。
  • 宽/宽聚类键将增加非聚簇索引的大小,也将增加索引叶块中每个条目的大小。 因此,每个块将打包较少的条目,这将增加磁盘I / O —必须读取更多的索引页/块。

优点:

  • 聚集索引要求以排序的顺序(在聚集键上)物理存储行数据。 表中的INSERT(实际上是这里的聚簇索引)必须维护“排序顺序”的不变性。 因此,很有可能必须四处移动行(行在一个块内或跨块移动)以适应新的插入。 如果非聚集索引正在存储行定位器,那么每个这样的INSERT也将需要更新非聚集索引,因为行定位器会由于行移动而发生变化。
  • 但是因为非聚集索引存储聚集索引键而不是行定位符,所以由于行移动而不需要进行此类更新。

查询优化器如何使用索引

精心设计的索引可以减少磁盘I / O操作并消耗更少的系统资源,从而提高查询性能。 索引对于包含SELECT,UPDATE,DELETE或MERGE语句的各种查询很有帮助。 考虑E mpDataBase2018(Imaginary)数据库中的查询SELECT标题HireDate FROM HumanResources.Employee WHERE EmployeeID = 250。 执行此查询时,查询优化器会评估每种可用的方法来检索数据并选择最有效的方法。 该方法可以是表扫描,或者可以扫描一个或多个索引(如果存在)。

执行表扫描时,查询优化器将读取表中的所有行,并提取满足查询条件的行。 表扫描会生成许多磁盘I / O操作,并且可能会占用大量资源。 但是,例如,如果查询的结果集来自表的行的百分比很高,则表扫描可能是最有效的方法。

当查询优化器使用索引时,它将搜索索引键列,查找查询所需的行的存储位置,并从该位置提取匹配的行。 通常,搜索索引比搜索表快得多,因为与表不同,索引通常每行包含很少的列,并且行按排序顺序排列。

查询优化器通常在执行查询时选择最有效的方法。 但是,如果没有可用的索引,则查询优化器必须使用表扫描。 您的任务是设计和创建最适合您的环境的索引,以便查询优化器可以从中选择有效的索引。

使用聚集索引时,行将以与索引相同的顺序物理存储在磁盘上。 因此,只能有一个聚簇索引。

使用非聚集索引时,第二个列表具有指向物理行的指针。 您可以有许多非聚集索引,尽管每个新索引都会增加写入新记录所需的时间。

如果要取回所有列,通常从聚集索引中读取会更快。 您不必先进入索引,然后再进入表。

如果需要重新排列数据,则写入具有聚集索引的表的速度可能会变慢。

聚集索引可很好地扩展,因为它们在内部使用B树结构。 在表上执行索引查找操作时,SQL Server可以有效利用此结构。 但是,选择正确和正确的集群密钥是一项艰巨的任务。

希望本文对希望了解后端数据库索引的人有用,请❤️将此文章推荐给其他人😊。 让我知道您的反馈。 🙂

Interesting Posts