一.索引的目的
- 为了提高数据查询效率,像书的目录一样。
二.索引常见的模型:
- 哈希表,有序数组和搜索树
- 哈希表是一种以键值对存储数据的结构,我们只要输入带查找的键即可找到对应的value
- 哈希的思路很简单,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。
哈希碰撞解决方法:
- 开放地址法--在接着往下找空余位置放置
- 拉链法------数组加链表的写法
- 再哈希法----发生冲突的时候再用另一个哈希函数计算出哈希值,直到算出有空余位置的放置
- 建立公共溢出区-创建哈希表时候再额外创建一个公共溢出区,专门用于存放发生哈希冲突的元素。查找时,先从哈希表查,查不到再去公共移出去查
哈希表这种结构适用于只有等值查询的场景
有序数组
- 在等值查询和范围查询场景中的性能都非常优秀
- 有序数组用二分查找的时间复杂度是O(logn)
缺点:
- 更新数据时,任何插入都必须挪动 后面的所有记录,成本很高。
总结:
- 有序数组索引只适用于静态存储引擎
二叉搜索树
- 二叉搜索树的特点是:父节左子树所有结点的值小于父结点的值,右子树所有结点的值大于父节点的值
- 时间复杂度是O(log(N))
三.InnoDB的索引模型
在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表
InnoDB使用了B+树模型,所以数据都存储在B+树中。
主键索引和非主键索引
- 主键索引的叶子节点存的是郑航数据。在InnoDB里,主键索引也被称为聚簇索引
- 非主键索引的叶子节点内容是主键的值,在InnoDB里非主键索引也被称为二级索引
如果语句是 select * from T where ID=500,即主键查询方式,则搜索ID这课树这棵B+树-----主键查询
如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索K索引树,得到ID值为500,再到 ID 索引树搜索一次。这个过程称为回表。
索引维护
B+树
- 插入新数据会产生: 挪动,页分裂等问题
- 尽量使用主键查询