我正在学习数据库和 SQL。从我读过的内容来看,向表中添加索引可以将性能从大约 (log(n)) 提高到甚至恒定时间。
考虑到空间使用量的增加,在什么时候向表中添加索引才有意义?
例如,如果我在使用员工表时,在添加索引之前该表必须有多少条记录?
在这种特定情况下,聚集索引是否有意义?
我正在学习数据库和 SQL。从我读过的内容来看,向表中添加索引可以将性能从大约 (log(n)) 提高到甚至恒定时间。
考虑到空间使用量的增加,在什么时候向表中添加索引才有意义?
例如,如果我在使用员工表时,在添加索引之前该表必须有多少条记录?
在这种特定情况下,聚集索引是否有意义?
这里有两个例子可以帮助你思考这个问题。这些在技术上并不准确(例如,因为磁盘上连续读取的效果比随机寻道更有效),但它们只是一个说明。
第一个例子是想象一个有几个块大小的小桌子。要在表中查找特定行,数据库将读取这两个块并获取您需要的数据。
如果该表上有索引,则该索引可能小于该表。也许只有一个街区。如果优化器选择使用此索引,那么数据库将读取单块索引,然后读取包含所需行的表的单块。
如上所述,这只是一个示例,旨在模拟现实而不是准确的。实际上,Oracle 经常会对带有索引的表进行全表扫描,即使该索引只返回 5% 的行(或者现在使用 11G 时它会更少吗?)。
第二个示例涉及对表进行数据修改。每当对表中的行进行更改 ( INSERT
, UPDATE
, DELETE
, MERGE
) 时,表上的每个索引都需要更新。
因此,索引可能会使查询更快而更新更慢。索引占用空间。这就是你付出的代价。
您问“在添加索引之前,表必须有多少条记录”?我认为您以错误的方式看待它,因为这不应该让您担心。当表有零行时添加索引。优化器会找出正确的方法。如果使用索引更快,它将使用它。如果避免索引并对表进行完整扫描更快,那么它将执行此操作。
我通常会索引用于主键和外键的列以及任何经常用于访问的列。
一般来说,我不会太担心索引使用的空间,除非表非常大(在这种情况下,可能值得查看位图索引)。这是空间与时间的权衡,但索引将小于被索引的表。
如果您担心压缩索引的空间,另一种选择。这应该不会对性能产生太大影响,但会占用更少的空间。请注意,这与表压缩不同。
要给出汤姆·凯特的“这取决于”的答案,还有很长的路要走。您可能做的最好的事情就是对您的特定问题进行基准测试并从那里开始。您似乎正在尝试进行过早的优化,这绝不是一件好事。
我的意见是在您经常访问的列上使用索引(例如主键(这应该是默认值),搜索条件中的列),您在WHERE
子句中使用。它将加快检索速度。
您应该考虑该表将来可能会增长的事实,现在在其上放置索引为您做好准备。
一般来说,每个表都应该被索引。特别是,每个表都应该有一个主键,它会自动创建一个索引(很可能是一个聚集索引)。
但是,即使您没有创建主键,即使是非常小的表也会从索引中受益。