数据库索引

时间:2009-04-16 04:33:05

标签: database indexing

如果明智地使用索引,您如何向某人解释索引如何改善数据库的性能?我正在寻找一个好的,清晰的解释,因为它在书中太复杂了。

6 个答案:

答案 0 :(得分:9)

请耐心等待,这需要一段时间: - )。

想想一个简单的地址簿,你只需在新朋友或同事到达时添加记录(下一个条目将在5):

1. Bob Smith, 7 Station St, Wotahole, NJ
2. Greg Jones, 3 Railway Pde, Boot Hill, KA
3. Allan Brown, 27 Carriage Court, Washington, DC (home)
4. Allan Brown, 1066 Hastings Street, Washington, DC (work)
5. 

现在你需要找一个人的地址。没问题,我听说你只是扫描列表寻找名字,然后读掉地址。

现在,如果你非常受欢迎,你有1,024个像我这样的朋友(我是一个极客,我只分配两个朋友的朋友 - 我实际上有2,024个,但其中有1000个被关押了我可以一起得到另外24个: - )。

为了找到一个特定的朋友,你必须平均扫描512个条目(使用中的一半)。这很乏味。最糟糕的情况是扫描所有1,024个,找到你添加的最后一个人。

现在让我们添加该索引。每次添加新朋友/同事(或者如果他们导致你太麻烦就删除它们),你更新这个索引,它只按排序顺序存储名称以及完整条目的行号(地址中的索引页面)书是神奇的,并自动排序你写的所有内容。)

上面的迷你列表索引将是:

1. Allan Brown, 3
2. Allan Brown, 4
3. Greg Jones, 2
4. Bob Smith, 1

名称和行号比完整条目占用更少的空间,但最重要的方面是这个。

为了找到一个条目,您只需扫描最坏情况下的10个条目(log 2 1024)。首先,检查索引编号512.如果您要查找的名称大于该名称,则只需查看条目513-1024。如果它更少,你现在只对条目1-511感兴趣。在任何一种情况下,您都会立即将搜索空间减少一半。

使用原始方法,您只能丢弃您检查的方法,因为您没有可用的订购信息。

所以搜索空间的大小是这样的(我实际上对索引方法使用了2的幂,但它稍微好于此):

+-----------+----------------+------------+
| Iteration | Indexed method | Old method |
+-----------+----------------+------------+
|    0      |   1024         |    1024    |
|    1      |    512         |    1023    |
|    2      |    256         |    1022    |
|    3      |    128         |    1021    |
|    4      |     64         |    1020    |
|    5      |     32         |    1019    |
|    6      |     16         |    1018    |
|    7      |      8         |    1017    |
|    8      |      4         |    1016    |
|    9      |      2         |    1015    |
|   10      |      1         |    1014    |
+-----------+----------------+------------+

找到索引后,从中提取行号,因为您知道每页有16个条目,条目号275(例如)位于第18页第4行。您可以直接没有进一步的搜索。

因此,以更多存储空间和维护索引的时间为代价,您极大地提高了搜索速度。这就是索引在数据库中的作用。

答案 1 :(得分:3)

我会使用经典的解释:

索引提供了一种有序且快速的方法来遍历数据集。

经典的例子是电话簿 - 它按字母顺序按名称加载 - 这可以加快您的访问速度,因为您可以使用索引方法直接找到您想要查找的名称。

数据库实际上并没有什么不同 - 您不必使用EmployeeId = 123扫描整个表。您只是扫描索引,以已知顺序存储,最终表现得更好。

答案 2 :(得分:3)

如果你的问题中的关键词是“明智地”,那么重要的是要提到索引的好处是快速查询,权衡是速度和大小。

就像在电话簿中一样,维护索引需要一些额外的时间,而且索引本身也需要一些空间。每当在数据库中添加或删除记录时,都需要花费一些时间来更新索引。

因此,对具有高插入率等的数据库的索引进行过度杀伤可能不会被视为明智的用途。但是,仔细地使用索引来帮助加快查询可以对性​​能产生巨大的好处。

答案 3 :(得分:1)

答案 4 :(得分:1)

数据库索引可以帮助数据库在数据库表中快速查找记录,很像索引可以帮助您快速查找书中的信息。我认为关键是索引正确的数据,以便数据库可以快速查找最有意义的数据。使用书籍示例,您不会索引每个单词,您只需索引用户最有可能要查找的关键词。

答案 5 :(得分:0)

在搜索数据时,如果用于搜索的字段被编入索引,则可以直接引用数据(或数据范围,但将其留给非技术性对话)。

如果它们没有编入索引,则必须搜索整个表格进行比较以进行匹配。