数据库规范化后是否还需要索引


14

完成良好的归一化之后,还需要对表建立索引吗?这将如何影响性能?良好的规范化后,它甚至会以某种方式影响性能吗?

如果您已经具有主键和外键,通常会索引哪些列?

规范化数据库似乎已经有效。但是,我可能已经跳过了索引如何影响数据库。这仅在使用查询时有效吗?如何运作/执行并改善数据库?


5
如果您已经具有主键和外键,通常会索引哪些列?日期。名字 您可能需要搜索或排序的所有内容。
Carson63000

主键上的索引不算?
CodesInChaos

Answers:


34

是。实际上,您很可能需要更加注意索引。规范化是关于最佳存储。这通常与检索速度不一致,因为使用了具有复杂联接的更复杂查询。有时,维护需要快速检索速度的数据库的人会取消规范化,或将其数据排列在规范化程度稍差的结构中,以使检索更加容易。


21
标准化的目标不是存储效率,而是消除插入,更新和删除依赖项。 进一步阅读

4
我同意@MichealT,这与效率无关。逻辑一致性是我从链接中得到的。
JeffO 2013年

我将删除有争议的“效率”一词(尽管我确实认为这基本上归纳了标准化的一般目的),而仅使用“最优”一词,这取决于读者。归一化的实际目的与归一化数据库后仍需要索引的原因实际上并不相关。
2013年

56

我认为您误解了索引对数据库性能的影响。

索引可帮助数据库查找行。索引是专用的数据结构,以交换额外的磁盘空间和插入和更新时的某些性能,可以帮助数据库引擎驻留在匹配的行上。

因为它们需要额外的空间和成本(很少)性能来保持最新,所以作为数据库设计人员,您必须显式创建索引以适合您的应用程序和查询模式。

索引与数据库规范化正交。


4

是的,归一化之后,您仍然需要索引。

您正在使用的表的好处与规范化之前的表一样多。实际上,它们本身是相同的:表。

索引是您必须考虑的一件事,它可以帮助您更快地找到数据。规范化数据库的设计总是好的,但是有时出于性能原因,您必须对实现进行非规范化。但这只是基于案例的情况。


2

是。

索引是一种加快数据搜索速度的方法。一些查询是通过主键进行的,这些键通常由数据库引擎隐式索引,但是其他查询则可能使用其他列。通常,某些查询会按甚至不唯一的列进行搜索,因此在进行任何规范化后都不能成为主键。您可能必须索引此类列。

只有一种方法可以知道要创建哪些索引。以所有查询的应用程序,发现代表性的例子参数对他们和对数据库引擎展示自己的查询计划(所有的数据库引擎有EXPLAINEXPLAIN QUERY PLAN或类似的命令,它是在不同的引擎不同的称呼)和测试,他们需要多长时间。比创建索引可以加快速度较慢的索引。而且,不要忘记再次删除您尝试过但无助于避免浪费资源的索引。


1

除了最小的表以外,所有其他表通常都需要索引。几乎每个外键都应建立索引,而仅设置FK并不意味着您具有索引(至少在某些数据库中没有,请查阅数据库文档)。如果您经常会在其中受益的字段(您需要一定程度的数据可变性,例如布尔值不会受益)以及可以索引的字段,那么您经常加入或在where子句中使用的字段应该被索引。

但是,每个索引在加快选择速度的同时都会减慢inserts \ updates \ deletes的速度,因此请谨慎选择索引。

索引对于数据库中可接受的性能至关重要。


0

对于第三个范式,您肯定会在所有主键上都需要索引。

是否需要其他索引取决于数据库的使用方式。例如,如果您定期搜索特定邮政编码的客户,那么最好在客户表中为zip_code列建立索引。

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.