索引数据库


12

我对数据库不是很熟悉,现在我正在尝试了解索引机制。

据我所知,在RDBMS中,对列进行索引可以使按该列进行搜索的速度更快。对于三元组存储库也是如此,只有那里的索引假定您(例如)主要按主题搜索,然后按对象搜索,依此类推。

我不确定RDBMS,但是在三重存储中,您可以定义多个索引,让存储为每个查询选择最佳索引(希望我理解正确)。自然地,出现以下问题:

为什么我不应该将所有可能的索引添加到三元组存储中,并扩展到RDBMS,为什么不在每列上都建立索引(假设我不太懒惰)?

Answers:


25

因为从本质上讲,索引是一个额外的表,其中主键是您正在索引的字段,唯一的内容是主表的主键。因此,必须在使用您更新的字段的每个索引中复制每个更新。

这在嵌件上尤其明显。想象一下,如果您对一个表所做的每个插入都必须复制到其他20个表上。这将是痛苦的缓慢。

请注意,对于复合索引,群集索引和全文本索引,情况甚至更糟,但是我不想让您感到麻烦。


2

索引基本上是必须构建和存储的其他数据结构。构建inde会浪费CPU能力(在写操作期间),而存储ined则会浪费磁盘容量。

您为什么要构建和存储从未使用过的索引?


这是一个纯粹的理论问题(“如果/为什么不”)。
Dragos 2012年

@Dragos我认为从我的帖子中可以明显地看出这些问题的答案:如果这样做了,则每个写入操作都将变慢得多,并且每个记录都将浪费大量的磁盘容量。为什么不?因为CPU功能和磁盘存储很昂贵。
马捷Zábský

2

仅在需要时放置索引。根据经验,在开发数据库架构时,每个表都会从PK主键聚簇索引开始。这将是该表中数据的唯一标识符。可以在1列或多列上。

之后,我通常只在要强制执行唯一性的列上添加非群集唯一索引。

这是基本架构。随着应用程序的发展和成熟,我们会根据性能问题和查询数据的方式根据需要添加索引。

添加的每个索引都会增加使用的空间,并增加其他维护。因此,明智地选择索引。


在阅读您的答案时,我想到了另一个问题:主键通常会自动索引吗,还是我必须指定自己要被索引的主键?举例来说,在MySQL数据库中?
Dragos

是的,主键应为您的(SQL Server)自动创建聚簇索引。只有一个主键,因此每个表只有一个聚集索引。MySQL应该相似,但是也许MySQL专家可以验证。
乔恩·雷诺

2

索引的优势在于:1)一种可以快速搜索的数据结构,以及2)比实际表更紧凑的结构,从而使更多的索引适合内存而不是分页到磁盘。

如果在每列上都有一个索引,则索引本身将比它们所代表的表占用更多的空间。如果数据库确实确实使用了所有索引,则将需要更多时间才能将它们换入和换出内存。此外,每个索引都必须以惰性,更新或删除的方式进行更新。

除此之外,单列上的索引甚至都不是您可以做的最好的事情。实际上,大多数关系数据库都允许在多个列上建立索引,并且这些列的顺序很重要。例如,如果我想搜索数据库查找1980年至1984年之间去过杜克大学的所有人员,那么我想要的是(School,ClassYear)上的索引。该查询将无法使用具有相同列的索引,但将其取反。

因此,要创建每个可能的索引,至少要有n个!在索引中排列列的方式。仅5列,就有120个可能的索引。

由于存在许多可能的索引,因此您确实必须确定哪些索引对您的应用程序有用,并仅创建那些索引。


但是在您的示例中,在任何情况下,两个索引:一个在School上,另一个在ClassYear上有用吗?
Dragos'2

@Dragos当然可以。如果我还有另一个仅在“学年”以上的查询(所有在2004年上学的学生),那么“学年”索引可能会有用。不幸的是,查询引擎在决定何时使用什么索引时会使用很多因素。如果事实证明数据库中有一半的人在2004年确实上过学,那么数据库可能只是忽略索引,反而会扫描整个表。如果您想在这一点
Chris Pitman'2

我的意思是,如果我在School和ClssYear上有单独的索引,它们在搜索1980年至1984年间从班级到杜克大学的所有人员时是否有用?
Dragos 2012年

@Dragos这取决于特定的数据库引擎。例如,Postgres将使用一种称为“ 位图索引扫描”的方法来与多个索引的结果相交。由查询引擎决定使用哪个索引,并且该索引始终是特定于db的。
克里斯·皮特曼

2

为表中的每一列创建索引通常会浪费空间,并且正如其他人所提到的那样,它可能会减慢插入/更新操作的速度。索引用于加速查询。如果您在查询该列中的值时发现性能不佳,则只建议向该列添加索引。

某些数据库可能需要为表的主键创建索引,因此您可能无法选择该索引。同样,如果您的文本列很大,则有一些专为全文本搜索和索引而设计的技术,但是它们并不总是与小的数字列使用的索引类型相同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.