mysql索引小知识

哎呀, 很久都没更新文章了,密码都要忘了...

之后尽可能努力要隔两天发一篇平常骚扰文。mysql

咱们常见的结构能够作数据库索引结构嘛

1. 哈希

哈希表这种结构适用于只有等值查询的场景. 对于区间类查询将会悲剧。sql

2. 有序数组

有序数组在等值查询和范围查询场景中的性能就都很是优秀 , 可是若是插入 删除操做成本高,适合数据不变化或只新增.数据库

3 .树类结构之 二叉树

搜索效率最高,可是相应树的高度高。致使读磁盘数据块次数多,下降性能数组

从下降磁盘次数提升性能优化可使用以下操做: 下降树的高度, 造成n叉树, 父节点能够所有缓存到内存。缓存

innodb的默认索引结构

咱们mysql数据库常用的为 b+ 树, 每个索引对应一个 b+ 树。性能优化

B+树每一个节点能够有多个值, 这样能够下降树的高度,有效减小磁盘的读取次数. 全部叶子节点拥有链指针,对于区间查询更加方便快速。网络

按存储形式区分索引

主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引 (clustered index)性能

非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引 (secondary index)优化

基于主键索引和基于普通索引区别

基于主键索引只须要扫描一次树便可, 而基于普通索引扫描到主键, 再回表扫描主键索引。.net

回表的意思这里表示查询一次树,再根据主键扫面主键B+索引。

(图片来源网络)

B+树的索引维护

固然也有问题, 当你插入、删除的大量节点数据为无序型数据时, 会形成频繁的页分裂、索引维护问题, 产生空间碎片, 可能会致使性能降低。

因此为何咱们尽可能采用主键为整型的递增顺序呢?

1. 页分裂

若是叶子节点保存了 200 400 500,此时插入300,会将400 500空出以前的位置,加入300。

若是此时此数据页已满, 则根据b+树, 会从新申请数据页, 此为页分裂。

2. 页合并

固然有分裂就有合并。当相邻两个页因为删除了数据,利用率很低以后,会将数据页作合并。合并的过程,能够认为是分裂过程的逆过程。

3. 选择主键的讲究

显然,主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。因此咱们通常推荐 int(4字节) 或 bigint(8字节) 来做为主键,占用空间最小, 而且有序。

一样下降索引的大小对于基于此索引的 B+ 树扫描,一样有益。

参考B B+ B- 树介绍链接+图例: blog.csdn.net/u013411246/…

相关文章
相关标签/搜索