seegongsik
我的单词本
数据

让查找变快,索引

想象在一本厚书里找一个词。从第一页读到最后一页太慢了。所以书后面有索引。它列出词和页码,你就能直接跳到那一页。数据库也一样。数据一多,从头扫太慢,所以它会提前建好一份叫索引的查找地图。

01

书后面有索引

前面我们看过数据库
怎么找到想要的那一行。
可数据一多,
从头扫到尾就慢。
这就跟在厚书里
从第一页找一个词一样。
所以书后面有索引。
词旁边写着页码,
你就能直接跳到那一页。

在厚书里找一个词
page 1
page 2
page 3
page 4
page 5要找的词
page 6
索引: 词 -> page 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. 不是免费的 (空间 + 更新)
按按钮,依次回顾要点

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

现在你知道索引
怎么让查找变快了。
看过了快速找数据,
接下来聊聊
怎么安全地处理数据。
很多人同时
动同一份数据会怎样?
那个棘手的问题,
下一讲一起解。

一句话总结数据一多,从头扫就慢。索引就像书后的查找表,是提前建好的地图,让数据库直接跳到对的位置。它有两种。哈希索引一步就精准找到一个准确的值。树索引把值排好序,适合扫一个范围。不过它不是免费的。索引要占额外空间,数据一变,索引也得跟着更新。即便如此,用得好,查找会快得多。
数据
如果有帮助,请支持我们