宜春网站建设公司,高端网站设计哪家公司好,网站安全和信息化建设,南宁购物网站建设此系列文章为极客时间课程《MySQL 实战 45 讲》的学习笔记#xff01;
索引的常见模型
可以提供查询效率的数据结构有很多#xff0c;常见的有三种#xff1a;哈希表、有序数组、搜索数。
哈希表是一种以 key-value 形式存储的数据结构。输入一个 key#xff0c;通过固定…此系列文章为极客时间课程《MySQL 实战 45 讲》的学习笔记
索引的常见模型
可以提供查询效率的数据结构有很多常见的有三种哈希表、有序数组、搜索数。
哈希表是一种以 key-value 形式存储的数据结构。输入一个 key通过固定的哈希算法计算出这个 key 存储在数组的位置若多个 key 计算的位置相同也就是hash冲突则用链表存储。这种数据结构的弊端是范围查找的效率非常低需要全部扫描。哈希表这种结构适用于只有等值查询的场景。有序数组中存储的数据是按照顺序依次存储的数据中它在等值查询和范围查询中都是非常高效的。但是一旦涉及到更新或者新增时效率就变得非常低因为需要移动数组中的元素以便满足有序。所以有序数组索引只适用于静态存储引擎比如你要保存的是 2017 年某个城市的所有人口信息这类不会再修改的数据。搜索数既能解决查询问题又能解决更新问题而且多叉搜索数还可以降低IO 磁盘的交互从而提升查询效率。
InnoDB 的索引模型
在 MySQL 的InnoDB 存储引擎中索引使用的是 B 树的存储结构这种结构的特点是非叶子节点存储的是索引值这样可以尽量使每个数据页存储最多的索引叶子节点存储的是索引值对应的那一行数据。并且叶子节点之间是用双向链表连接的且是按照顺序连接这样就可以做范围查找。
InnoDB 中的索引分为主键索引聚簇索引和非主键索引二级索引。
主键索引的叶子节点存的是整行数据。在 InnoDB 里主键索引也被称为聚簇索引clustered index。非主键索引的叶子节点内容是主键的值。在 InnoDB 里非主键索引也被称为二级索引secondary index。 那么基于主键索引的查询和基于普通索引的查询有什么区别呢 如果语句是 select * from T where ID500即主键查询方式则只需要搜索 ID 这棵 B 树 如果语句是 select * from T where k5即普通索引查询方式则需要先搜索 k 索引树得到 ID 的值为 500再到 ID 索引树搜索一次。这个过程称为回表。
索引维护
建立索引可以有效的提升查询效率但是会不可避免的带来索引维护问题。
比如上面的图中我们添加一条 ID 是 700 的数据则直接在 R5 的后面添加即可此时的效率影响不大但是要新增一条 ID 是 400 的数据就需要在 R3 和 R4 中间添加了这时若这个数据页满了就会有页分裂的情况就是产生一个新的数据页将原数据页的一部分数据移动到新的数据页此时数据页的利用率就低了。那么在删除数据时若数据页的数据很少且相邻数据也的数据也不多时就会合并两个数据页节省空间这个过程叫做页分裂的逆向过程。
所以我们在日常创建数据库表的时候建议主键自增这样每次添加数据就不会产生页分裂了。