哎呀, 好久都没更新文章了,密码都要忘了…
以后尽量努力要隔两天发一篇日常骚扰文?。
哈希表这种结构适用于只有等值查询的场景. 对于区间类查询将会悲剧。
有序数组在等值查询和范围查询场景中的性能就都非常优秀 , 但是如果插入 删除操作成本高,适合数据不变化或只新增.
搜索效率最高,但是相应树的高度高。导致读磁盘数据块次数多,降低性能
从降低磁盘次数提高性能优化可以使用如下操作: 降低树的高度, 形成n叉树, 父节点可以全部缓存到内存。
我们mysql数据库经常使用的为 b+ 树, 每一个索引对应一个 b+ 树。
B+树每个节点可以有多个值, 这样可以降低树的高度,有效减少磁盘的读取次数. 所有叶子节点拥有链指针,对于区间查询更加方便快速。
主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引 (clustered index)
非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引 (secondary index)
基于主键索引只需要扫描一次树即可, 而基于普通索引扫描到主键, 再回表扫描主键索引。
回表的意思这里表示查询一次树,再根据主键扫面主键B+索引。
(图片来源网络)
当然也有问题, 当你插入、删除的大量节点数据为无序型数据时, 会造成频繁的页分裂、索引维护问题, 产生空间碎片, 可能会导致性能下降。
所以为什么我们尽量采用主键为整型的递增顺序呢?
如果叶子节点保存了 200 400 500,此时插入300,会将400 500空出之前的位置,加入300。
如果此时此数据页已满, 则根据b+树, 会重新申请数据页, 此为页分裂。
当然有分裂就有合并。当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程。
显然,主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。所以我们一般推荐 int(4字节) 或 bigint(8字节) 来作为主键,占用空间最小, 并且有序。
同样降低索引的大小对于基于此索引的 B+ 树扫描,同样有益。
https://blog.csdn.net/u013411246/article/details/81088914