索引在什么时候变得必要或值得?

时间:2012-06-12 13:28:36

标签: sql database oracle database-design indexing

我正在学习数据库和SQL。根据我的阅读,向表中添加索引可以将性能从大约(log(n))提高到甚至恒定时间。

考虑到空间使用的增加,在什么时候向表中添加索引是有意义的?

例如,如果我在使用employees表时,在添加索引之前表必须有多少条记录?

在这种特定情况下,聚集索引是否有意义?

3 个答案:

答案 0 :(得分:3)

以下两个例子可以帮助您思考这个问题。这些不是技术上准确的(例如,由于连续读取对磁盘的影响比随机搜索更有效),但它们是一个例子。

第一个例子是考虑一个大小为几个块的小表。要查找表中的特定行,数据库将读取这两个块并获取所需的数据。

如果该表上有索引,则索引可能小于该表。也许一块大小。如果优化器选择使用此索引,则数据库将读取一个块索引,然后读取包含所需行的表的一个块。

如上所述,这只是一个例子,旨在模拟现实而不是准确。实际上,Oracle通常会对带有索引的表进行全表扫描,即使索引只返回行的5%(或者现在使用11G会减少?)。

第二个例子涉及在表格上进行数据修改。每当更改表格中的行(INSERTUPDATEDELETEMERGE)时,表格上的每个索引都需要更新。

因此,索引可以使查询更快,更新速度更慢。索引占用空间。这是你支付的价格。

你问“在添加索引之前表格必须有多少条记录”?我认为你正在以错误的方式看待它,因为这不应该让你担心。当表有零行时添加索引。优化器将找到正确的事情。如果使用索引更快,它将使用它。如果更快地避开索引并对表进行全面扫描,那么它就会这样做。

我通常会索引用于主键和外键的列以及经常用于访问的任何列。

一般来说,我不会过分担心索引使用的空间,除非表格非常大(在这种情况下,可能值得查看位图索引)。这是空间与时间的权衡,但索引将小于被索引的表。

另一种选择,如果你担心空间压缩索引。这不应该对性能产生太大影响,但会占用更少的空间。请注意,这与表压缩不同。

这是给汤姆·凯特回答“它取决于”的漫长道路。你可以做的最好的事情是对你的特定问题进行基准测试并从那里开始。你似乎试图做一个永远不会是好事的过早优化。

答案 1 :(得分:1)

我的观点是在您经常访问的列上使用索引(如主键(这应该是默认值),搜索条件中的列),您在WHERE子句中使用。它将加快检索速度。

你应该考虑这个表可能在将来增长的事实,现在把索引放在上面为你做好准备。

答案 2 :(得分:1)

通常,每个表都应编入索引。特别是,每个表都应该有一个主键,它将自动创建一个索引(很可能是一个聚簇索引)。

但是,即使您没有创建主键,即使非常小的表也会受益于索引。

相关问题