一.索引的目的

  • 为了提高数据查询效率,像书的目录一样。

二.索引常见的模型:

  • 哈希表,有序数组和搜索树
  • 哈希表是一种以键值对存储数据的结构,我们只要输入带查找的键即可找到对应的value
  • 哈希的思路很简单,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。

哈希碰撞解决方法:

  1. 开放地址法--在接着往下找空余位置放置
  2. 拉链法------数组加链表的写法
  3. 再哈希法----发生冲突的时候再用另一个哈希函数计算出哈希值,直到算出有空余位置的放置
  4. 建立公共溢出区-创建哈希表时候再额外创建一个公共溢出区,专门用于存放发生哈希冲突的元素。查找时,先从哈希表查,查不到再去公共移出去查

哈希表这种结构适用于只有等值查询的场景

有序数组

  • 在等值查询和范围查询场景中的性能都非常优秀
  • 有序数组用二分查找的时间复杂度是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+树

  • 插入新数据会产生: 挪动,页分裂等问题
  • 尽量使用主键查询