mysql索引(2) - 索引内部结构

主要说明BTree和Hash索引
1.常用的加快查找速度的数据结构

树:
    二叉查找树:查询/插入/修改/删除的平均时间复杂度都是O(n)	
    平衡二叉树:查询/插入/修改/删除的平均时间复杂度都是O(logn)
    红黑树:查询/插入/修改/删除的平均时间复杂度都是O(logn)
哈希:
    HashMap:查询/插入/修改/删除的平均时间复杂度都是O(1)
    HashSet:查询/插入/修改/删除的平均时间复杂度都是O(1)
    

总结:
    如果是对单行的数据进行查询,很明显哈希索引很快,但是由于mysql不能确定两个值之间会存在多少行的数据,这时使用哈希索引,它的时间复杂度会退化为O(n),而树型的索引的时间复杂度仍然是O(logn)

2.BTREE索引与HASH索引

MyISAM 和 InnoDB 存储引擎的表默认创建的都是 BTREE 索引
(1).Hash索引
    ~  只用于使用=或<=>操作符的等式比较。
    ~  优化器不能使用 HASH 索引来加速 ORDER BY 操作。
    ~  只能使用整个关键字来搜索一行。
    ~  由于mysql不能确定两个值之间会存在多少行的数据,数据多时使用树型索引
(3)BTree索引
    (1)B树
    ~  由于B树不同于二叉树的二叉搜索,B树可以进行m叉搜索
    ~  B树的非叶子节点和叶子节点都可以存储数据,优于二叉树的每个节点存储的是记录
    ~  B树可以通过中序遍历获得所有的节点
    (2)B+树
    ~  在B树的基础上进行了改进,仍然是m叉搜索树
    ~  B+树非叶子节点不在存储数据,而是将数据存储在同一层的叶子节点上。(B+树中根到每一个节点的路径长度一样)
    ~  叶子之间,增加了链表,获取所有节点,不再需要中序遍历

3.B树索引和B+树索引比较

(1)B树适合做索引的原因
    ~  B树充分的利用到了磁盘预读(不是按需读取,按页读取,一次读一页(4k),如果之后读取的数据存在预读的数据中,那么就可以很好的提高I/O效率)--依据局部性原理
    ~  由于B树是m分叉的,所以树的高度能够降低很多;
    ~  每个节点可以存储n个记录,如果将节点大小设置为页大小,可以利用磁盘预读,极大减少磁盘IO;
    
(2)B+树比B树更适合做为索引的原因
    B树:有序数组+平衡多叉树,B+树:有序数组链表+平衡多叉树;
    范围查找:定位min与max之后,中间叶子节点,就是结果集,不用中序回溯;
    叶子节点存储实际的数据记录,适合数据量大的磁盘存储,非叶子节点存放是记录的key,可以存放更多的索引
    总结:
        B+树的查询效率更高效
        B+树的磁盘读写代价更低
        B+树空间利用率更高,可减少I/O次数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值