数据库索引见博文 数据库索引
索引能提高检索效率,降低数据库的IO成本。还能降低数据排序成本。每个索引中的数据是按照索引键值进行排序后存放的,如果排序字段和索引键字段刚好一致,MySQL Query Optimizer 就会告诉 mysqld 在取得数据后不用排序了。因为根据索引取得的数据已经满足客户的排序要求。
B-树(读作B树,注意不要读B减树)
数据库索引是存储在磁盘上的,当数据量大的时候,索引可能达到几个G。利用索引查询的时候,不能把整个索引加载到内存上。只能逐一加载每一个磁盘页,这里的磁盘页对应索引树的节点。
参考此处
https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653190965&idx=1&sn=53f78fa037386f85531832cd5322d2a0&chksm=8c9909efbbee80f90512f0c36356c31cc74c388c46388dc2317d43c8f8597298f233ca9c29e9&scene=21#wechat_redirect
参考此处https://mp.weixin.qq.com/s/jRZMMONW3QP43dsDKIV9VQ
B-树和B+树
B-树是在二叉查找树上做改进,二叉树变矮胖,减少磁盘IO次数。虽然他的比较次数不比二叉查找树少,但是在内存中的比较耗时和磁盘IO速度比,内存中的比较可以忽略。
B+树是在B-树上进一步改进。多了以下一些功能,所有数据都保存在叶子节点上,并且叶子节点依照关键字的大小自小而大顺序链接。所有中间节点元素同时存在于子节点,是子节点中最大或最小元素。
二、B+数都要找到叶子节点,查询耗时很稳定。三、查询一个范围的数据,B-数需要中序遍历,B+数直接用叶子节点的链表查询。
综上B+树相比B-树的优势有三个
1、IO次数更少
2、查询性能更稳定
3、范围查询更简便。(B-树范围查询需要做中序遍历,B+树叶子节点本身是从小到大的链表结构)
B+树的特征:
1.每个中间节点不保存数据,只用来索引,所有数据都保存在叶子节点。
(这里的保存数据有两种方式,一种是直接保存数据(聚集索引),一种是保存指向数据的指针(非聚集索引))。
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
都是多路平衡树,一般数据库索引用的是B+树。
聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。
索引:用于提高数据访问速度的数据库对象。
1)索引可以避免全表扫描;
2)对于非聚集索引,有些查询甚至可以不访问数据项;
3)聚集索引可以避免数据插入操作集中于表的最后一个数据页;
4)一些情况下,索引还可以避免排序。
缺点:虽然索引可以提高查询速度,但是他们也会导致数据库更新数据的性能下降,因为大部分数据更新时需要同时更新索引。索引需要存储空间。