数据库索引

索引的结构

大部分DBMS都会采用B+树实现索引,这种数据结构可以提高查询时的效率,假设有如下表:

PID BID AMOUNT
1001 B1 5000
1005 B2 3000
1010 B3 9000

我们可以对PID建立索引(若PID为主键,数据库会为我们自动创建索引),索引呈现出来的树结构如下:

1
2
3
       [1005]
/ \
[1001] [1010]

对于任意一个非叶子结点,左子树结点的值都比其小,右子树结点的值都比其大(若为字符串则根据字符串顺序,其他数据类型类似),根据这个特性,比如我们要查找1010,首先进入1005结点,发现1010比1005大,则向右子树查找,直接就找到了1010,仅需比较2次。而如果不使用索引,则会顺序查找,需要比较3次,对于大数据量时,使用索引的效率提升会更加明显。

查询效率是提升了,那么代价是什么呢?答案是会降低修改表中数据时的效率,因为在插入时,数据库要保持B+树的平衡结构以及"左子树结点的值都比其小,右子树结点的值都比其大"这个特性。

并且,对大部分数据都不重复的列建立索引比对大部分数据都相同的列建立索引带来的查询效率提升是要更明显的,这一点也可以根据B+树的特点看出来,例如,有一个学生表,对于身份证一列建立索引带来的查询效率的提升就比对性别一列建立索引带来的查询效率的提升要明显(因为身份证一列的数据两两都不相同,而性别只有两种)

索引的储存和加载

索引仍然会储存在磁盘上,而不是驻留在内存中,每次需要使用索引时,数据库才会试图加载索引,如果索引已经在内存中(在一个名为缓冲池的地方),那么就直接从内存中读取,否则,从磁盘上加载到缓冲池中暂存

是否需要使用索引是根据你输入的SQL语句决定的,DBMS内部的SQL优化器会对你的SQL语句进行分析以确定你的SQL中是否引用了带索引的列,从而决定是否加载索引