Tag: Dbms

系统设计,第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 = […]