详谈数据库索引

Posted kma-3

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详谈数据库索引相关的知识,希望对你有一定的参考价值。

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。

1、索引类型有:B树索引、哈希索引、空间数据索引(R树)、全文索引。

常见的索引结构有:哈希索引和B+树索引

 1)哈希,例如HashMap,查询/插入/修改/删除的平均时间复杂度都是O(1);

 2)B树,查询/插入/修改/删除的平均时间复杂度都是O(lg(n));

对于大多数的mysql引擎都是B树索引结构,虽然哈希索引结构检索速度能够达到O(1)但是仅限于查询单个记录,对于大范围内的查询、排序、分组、比较等查询哈希结构就退化为O(n),而对于B树结构仍然可以保持O(lg(n))。

2、对于树形结构索引可以对比几种不一样的树形结构:二叉树、B树、B+树。

1)二叉树

        技术分享图片

  - 因为一棵深度为k,最多有2^k-1个节点,所以当数据量大的时候,树的高度会比较高,数据量大的时候,查询会比较慢;
  - 由于二叉树自身结构,每个节点只存储一个记录,可能导致一次查询有很多次磁盘IO;

2)B树

技术分享图片

   - 不再是二叉搜索,而是m叉搜索;
   - 叶子节点,非叶子节点,都存储数据;
   - 中序遍历,可以获得所有节点;
   - 由于是m分叉的,高度能够大大降低,能够极大减少检索时间;
   - 每个节点可以存储j个记录,利用局部性原理每一次读取磁盘数据能够将相近的数据全部读取出来,极大减少磁盘IO;

3)B+树

技术分享图片

  B+树是B树的变形,仍然是m叉搜索树,可以更加适合作为索引结构。

  - 跟B树不一样的是非叶子节点不再存储数据,数据只存储在同一层的叶子节点上,所以B+树中根到每一个节点的路径长度相同。
  - 叶子之间,增加了链表,获取所有节点,不再需要中序遍历;
  - 范围查找,定位min与max之后,中间叶子节点,就是结果集,不用中序回溯,这个在范围查询在SQL中用得很多,这是B+树比B树最大的优势。
  - 叶子节点存储实际记录行,记录行相对比较紧密的存储,适合大数据量磁盘存储;
  - 非叶子节点,不存储实际记录,而只存储记录的KEY的话,那么在相同内存的情况下,B+树能够存储更多索引;

3、Mysql常用的两个引擎InnoDB和MyISAM都使用B+索引的差异

1)MyISAM引擎

MyISAM引擎使用B+Tree作为索引结构,索引文件和数据文件是分开的,索引的叶节点data域存放的是数据记录的地址。检索过程首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。
primary key索引结构:
技术分享图片
对于其他的辅助索引和主键索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
2)InnoDB引擎
在InnoDB中,与MyISAM不同点在于,InnoDB的数据和主索引在一起,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。通常数据都存储在主键的叶子节点上即为聚集索引,叶子节点上面只存储主键对应的值。
技术分享图片
对于辅助索引则和主索引不一样,在辅助索引中叶子节点不存储数据本身只存储对应的主键的值,所以辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键值,然后用主键到主索引中检索获得记录。
技术分享图片
 
 










以上是关于详谈数据库索引的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER数据库 唯一索引 非唯一索引 聚集索引 非聚集索引 之间区别

数据库表索引:普通索引唯一性索引全文索引多列索引隐藏索引删除索引

数据库索引有哪几种?怎样建立索引?

数据库基础:讲解MySQL索引的概念及数据库索引的应用[2]

Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面索引行复合索引中的一个切面

达梦数据库索引实践