seegongsik
数据

什么是数据库索引

假设要在一本厚书里找一个词。从第一页读到最后一页,太费时间了。所以书后面有索引:每个词都写着页码,可以直接翻到那一页。数据库也一样。数据一多,从头扫一遍就太慢了,所以要事先建好一份叫索引的查找表。

01

书后面有索引

前几课我们看了数据库怎样找到想要的那一行,也看了哈希和平衡树怎样快速查找。现在该看看这些工具在数据库里是怎么用的了。
数据非常多时,从头扫到尾就很慢,就像在厚书里从第一页开始找一个词。所以书后面附有索引,词语旁边写着页码。

在厚书里找一个词
page 1
page 2
page 3
page 4
page 5要找的词
page 6
索引:词 → 第 5 页
点两种方式比一比步数

点一下“从头扫正文”和“用索引跳过去”,比较一下。它会数出各要几步找到。

用索引跳过去,找到所用的次数少得多。数据库的索引正是这样的查找表:选表里的一列,把每个值和它所在行的位置配对,事先记下来。
不过,索引也分种类。找一个准确的值和找一个范围,合适的方法不一样。

02

准确的值用哈希索引

有时想找一个准确的值,比如“金哲洙”。这时,哈希索引就很合适。
前面学过的哈希会接过名字,直接算出位置号。所以不用一行行扫,一步就跳到那个位置。就像记住了储物柜的号码,直接打开那一格。

名字(准确的值)
位置格
0
1
2
3
4
点一下名字,用哈希找它的位置

点一下名字,哈希就算出位置号,一步跳到那一格。

凭一个名字就直接找到了位置。哈希索引找准确的值,就是这么快。
可它也有弱点。哈希把值打散存放,和值的大小毫无关系,所以没法按范围找,比如“20 岁到 30 岁”。这时就需要别的索引。

03

范围用树索引

有时想按范围找,比如“20 岁到 30 岁”。这时,树索引就很合适。树索引是用上一课的平衡树做成的,把值从小到大排好序。
所以找到起始值以后,就能从那里一路往旁边接着走,把范围里的值依次扫一遍。就像词典按字母顺序排好一样。实际上,大多数数据库默认用的就是这种树索引。

排好序的树索引(年龄)
点一下范围的起始值

点一下,定好要找的范围。排好序的树索引找到起始值,一路扫过范围里的值。

因为排好了序,范围就往旁边一路连下去。哈希是一下子点中一个点,树是一路扫过一条线。
所以,最常找什么,决定了用哪种索引合适:常找准确的值就用哈希,常找范围就用树。不过,索引不是免费的。

04

索引不是免费的

索引不只有好处。第一,它占额外的空间:查找表要另外记下来,就要多占那么多存储空间。
第二,数据一变,索引也得跟着改。每加一行或删一行,查找表也要跟着改,写入就会慢那么多。所以,不加考虑地建一大堆索引,反而吃亏。

数据表
Ann
Ben
Cho
索引(查找表)
Ann#0
Ben#1
Cho#2
索引占的空间:3 格
加一行或删一行,索引也跟着变

加一行或删一行看看。数据每变一次,索引就跟着更新一次,占的空间也越来越多。

每次改数据,索引都跟着动,占的空间也越来越多。所以,索引只挑经常要查的列来建。
这是把变快的好处,和空间、更新的代价放在天平上称一称。挑得好,查找就会快得多。

05

小结

用一句话概括:索引就像书后面的索引,是一份让你直接跳到想要位置的查找表。哈希索引一步就能点中一个准确的值,树索引因为排好了序,适合一路扫过一个范围。
不过,索引要多占空间,而且数据每变一次都得跟着更新。所以只挑经常要查的列来建。

1. 书后查找表 = 快速跳转的地图
2. 准确的值用哈希索引
3. 范围用排好序的树索引
4. 不是免费的(空间 + 更新)
按按钮,依次回顾要点

依次点要点回顾一下。(书后索引 → 准确的值用哈希 → 范围用树 → 不是免费的)

现在你知道索引是怎样让查找变快的了。到这里为止,我们处理的都是一行行排在表里的数据。
可有些时候,数据之间的连接本身才最重要,比如朋友关系或地铁线路。下一课会认识用点和线连起来存放的数据:图。

一句话总结数据多的时候,从头全部扫一遍很慢。索引就像书后面的索引,是事先建好的查找表,让数据库能直接跳到想要的位置。索引有两种。哈希索引一步就能点中一个准确的值。树索引的值排好了序,适合按范围查找。不过,索引不是免费的:它要多占空间,数据一变,索引也得跟着更新。即便如此,在经常要查的列上建好索引,查找就会快得多。
← 数据
如果有帮助,请支持我们