MySQL 索引详解
1.概述
1.1 简介
MySQL 官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法。
1.2 优缺点
1.2.1 优点
- 类似大学图书馆建书目索引,提高数据检索的效率,降低 数据库的IO成本(1),这也是创建索引最主要的原因
- 通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性
- 在实现数据的参考完整性方面,可以加速表和表之间的连接 。换句话说,对于有依赖关系的子表和父表联合查询时,可以提高查询速度
- 在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间 ,降低了 CPU 的消耗
(1):因为各个不同存储介质的读取速度,磁盘的 IO 对于我们来说,可能 0.01s 很快,但是对于 CPU 来说可能处理同样数据的时间为 0.001s 两者的时间差距是几百倍的,因此对于数据库操作来说,要尽量减少磁盘 IO 的次数,这也是创建索引这样数据结构的一个重要原因。
1.2.2 缺点
- 创建索引和维护索引要耗费时间,并且随着数据量的增加,所耗费的时间也会增加
- 索引需要占磁盘空间 ,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,存储在磁盘上,如果有大量的索引,索引文件就可能比数据文件更快达到最大文件尺寸
- 虽然索引大大提高了查询速度,同时却会降低更新表的速度 。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。
因此,选择使用索引时,需要综合考虑索引的优点和缺点
2.B+ 树
2.1 B 树(B-树)
B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以 O(logn) 的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于 2 个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。
2.1.1 定义
- 根节点至少有两个子节点
- 每个节点有 M-1 个key,并且以升序排列
- 位于 M-1 和 M key 的子节点的值位于 M-1 和 M key 对应的Value之间
- 其它节点至少有 M/2 个子节点
和普通的二叉搜索树最大的不同在于,二叉搜索树的子节点只能有两个,而 B 数不是。