什么是数据库索引
假设要在一本厚书里找一个词。从第一页读到最后一页,太费时间了。所以书后面有索引:每个词都写着页码,可以直接翻到那一页。数据库也一样。数据一多,从头扫一遍就太慢了,所以要事先建好一份叫索引的查找表。
书后面有索引
前几课我们看了数据库怎样找到想要的那一行,也看了哈希和平衡树怎样快速查找。现在该看看这些工具在数据库里是怎么用的了。
数据非常多时,从头扫到尾就很慢,就像在厚书里从第一页开始找一个词。所以书后面附有索引,词语旁边写着页码。
点一下“从头扫正文”和“用索引跳过去”,比较一下。它会数出各要几步找到。
用索引跳过去,找到所用的次数少得多。数据库的索引正是这样的查找表:选表里的一列,把每个值和它所在行的位置配对,事先记下来。
不过,索引也分种类。找一个准确的值和找一个范围,合适的方法不一样。
准确的值用哈希索引
有时想找一个准确的值,比如“金哲洙”。这时,哈希索引就很合适。
前面学过的哈希会接过名字,直接算出位置号。所以不用一行行扫,一步就跳到那个位置。就像记住了储物柜的号码,直接打开那一格。
点一下名字,哈希就算出位置号,一步跳到那一格。
凭一个名字就直接找到了位置。哈希索引找准确的值,就是这么快。
可它也有弱点。哈希把值打散存放,和值的大小毫无关系,所以没法按范围找,比如“20 岁到 30 岁”。这时就需要别的索引。
范围用树索引
有时想按范围找,比如“20 岁到 30 岁”。这时,树索引就很合适。树索引是用上一课的平衡树做成的,把值从小到大排好序。
所以找到起始值以后,就能从那里一路往旁边接着走,把范围里的值依次扫一遍。就像词典按字母顺序排好一样。实际上,大多数数据库默认用的就是这种树索引。
点一下,定好要找的范围。排好序的树索引找到起始值,一路扫过范围里的值。
因为排好了序,范围就往旁边一路连下去。哈希是一下子点中一个点,树是一路扫过一条线。
所以,最常找什么,决定了用哪种索引合适:常找准确的值就用哈希,常找范围就用树。不过,索引不是免费的。
索引不是免费的
索引不只有好处。第一,它占额外的空间:查找表要另外记下来,就要多占那么多存储空间。
第二,数据一变,索引也得跟着改。每加一行或删一行,查找表也要跟着改,写入就会慢那么多。所以,不加考虑地建一大堆索引,反而吃亏。
加一行或删一行看看。数据每变一次,索引就跟着更新一次,占的空间也越来越多。
每次改数据,索引都跟着动,占的空间也越来越多。所以,索引只挑经常要查的列来建。
这是把变快的好处,和空间、更新的代价放在天平上称一称。挑得好,查找就会快得多。
小结
用一句话概括:索引就像书后面的索引,是一份让你直接跳到想要位置的查找表。哈希索引一步就能点中一个准确的值,树索引因为排好了序,适合一路扫过一个范围。
不过,索引要多占空间,而且数据每变一次都得跟着更新。所以只挑经常要查的列来建。
依次点要点回顾一下。(书后索引 → 准确的值用哈希 → 范围用树 → 不是免费的)
现在你知道索引是怎样让查找变快的了。到这里为止,我们处理的都是一行行排在表里的数据。
可有些时候,数据之间的连接本身才最重要,比如朋友关系或地铁线路。下一课会认识用点和线连起来存放的数据:图。