DB索引如何工作?

时间:2011-10-15 11:50:49

标签: java database oracle

我试图找出如何找到DB索引以及何时应该使用它。我读了一些关于这个的文章,我找到的一个重要文章是How does database indexing work?

工作原理: -

Advantage2: - 在阅读上述链接的讨论后,一件事索引有助于减少迭代的数据块数量,如例1所述。

优势1: - 但是我又想到了一个问题,在引入索引后,它还必须从索引表(任何数据存储在内部制作)中搜索索引,这应该是时间了。因此,在进一步阅读后,我发现索引以有效的方式存储,通常使用像B树这样的数据结构,可以快速深入到任何值,并且在转到节点之后,它将为我们提供给定值的记录的确切内存位置在哪里或加入条件。正确?所以基本上索引会记录我们正在创建索引的记录值和实际记录的内存位置。

什么时候应该使用: - 我们知道如果我们在任何列上创建索引,并且如果我们插入/更新/删除该列的任何值,则需要为该列更新索引索引表。因此在CUD操作期间需要额外的时间和内存。因此,当它应该被使用时。想象我们从用户屏幕一次创建一个客户。所以在一天结束时总客户是100万。现在,如果我们想要搜索属于NewYork的客户,那么索引会有很大帮助。同意它会减慢插件客户的速度,这将是非常糟糕的,但我们将在纽约客户的检索过程中获得的性能将非常好。

如果您同意/不同意上述发现,请纠正我?

3 个答案:

答案 0 :(得分:1)

你的一般结论非常好。

是的,对于某些查询,索引意味着需要读取更少的数据块。

是的,Oracle中的默认索引类型是使用B-Tree在内部实现的。

是的,对于带有索引的表上的创建/更新/删除操作有一些开销 - 无论是在性能还是使用的空间方面 - 但这种开销通常可以忽略不计,并且在查询性能提高时很容易证明是合理的。考虑。

我衷心建议您阅读Oracle Concepts Guide on indexes

答案 1 :(得分:1)

之前的回复(以及您的结论)是正确的。关于何时使用索引,讨论何时不使用索引可能更容易。以下是可能不适合使用索引的几种情况。

  • 一个表格,您可以在其中执行高插入率,但从不或很少从中进行选择。这种表的一个例子可能是某种类型的日志表。

  • 一个非常小的表,其行全部适合一个或几个块。

答案 2 :(得分:1)

索引加速选择。
他们通过减少要检查的行数来实现此目的。

示例
我有一张1000,000,000行的表 id是主键 gender可以是malefemale city可以是50个选项之一 street可以有很多不同的选择。

当我在寻找一个唯一值时,使用索引会在完全平衡的树上进行30次查找 没有索引,平均需要500,000,000次查找 然而,对性别进行索引是没有意义的,因为它不会缩短搜索时间,足以证明使用索引所需的额外时间,查找项目以及而不是获取行中的数据。

对于city,它是一个边界案例。如果我有50个不同的城市,那么索引是有用的,如果你只有5个索引的基数很低而且不会被使用。

索引会降低插入和更新速度。

需要考虑的更多内容
MySQL每个表每个(子)选择只能使用一个索引 如果您想使用索引:

SELECT * FROM table1 WHERE city = 'New York' AND Street = 'Hoboken' 

您必须声明一个复合索引:

ALTER TABLE table1 ADD INDEX index_name (city, street)