登录  /  注册
博主信息
博文 55
粉丝 3
评论 0
访问量 66728
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
Mysql索引以及Btree和B+tree
王佳祥
原创
208人浏览过

Mysql索引以及Btree和B+tree

1.索引的本质:

  • 索引类似于书籍的目录,用于帮助MySQL更高效地定位和检索数据。
  • MySQL索引是一种数据结构,目的是减少磁盘I/O操作,提高数据查询速度。

2.二叉搜索树(Binary Search Tree, BST):

  • 在理想情况下,BST可以通过比较节点值实现高效的查找,但在最坏的情况下,如果插入顺序导致BST退化为链表形态,则查询效率大大降低。

3.平衡二叉树(Balanced Binary Search Tree, 如AVL、红黑树等):

  • 平衡二叉树通过自我调整保持左右子树高度差不超过1,确保查询效率稳定。
  • 但即使是平衡二叉树,由于每个节点只能存储少量数据(例如一个元素),对于MySQL这样的系统来说,其单位磁盘块(配置)中包含的有效数据过少,会导致I/O操作频繁,查询性能不高。

4.B-tree(B树):

  • B树相比于二叉树的优势在于,每个节点可以拥有多个子节点(M阶B树就有M个子节点),这样单个节点可以存储多个元素,提高了每个磁盘块的利用率。
  • 这样做减少了查询时所需的层级数量,从而减少了I/O操作次数。

5.B+tree(B+树):

  • B+tree是对B树的改进,尤其适用于数据库索引:
  • 叶子节点存储所有数据,非叶子节点仅存储索引信息。
  • 叶子节点之间通过指针连接,便于范围查询,只需要遍历叶子节点即可,不需要像B树那样可能需要访问非叶子节点。
  • 每个节点可以存储更多元素,进一步增加了每个磁盘块包含的有效数据量,降低了I/O成本。

总结:

  • MySQL选择B+tree作为索引数据结构的原因主要是考虑到磁盘I/O效率以及对大量数据和范围查询的支持能力。同时,MySQL中默认配置的一个节点(即磁盘块)通常能够存储16KB的数据,这也是设计索引结构时需要考虑的重要因素。

  • B+树由于非叶子节点不存储数据,而是只存储索引信息,使得单个节点能容纳更多的索引项,进而大幅提升了数据存储量。三层B+树理论上可以支持12亿条数据的存储,远高于B树,这对于大规模数据查询非常有利,且查询次数较少,通常只需经过3次I/O即可找到所需数据

问题:

  • 为什么不推荐UUID做主键?

    UUID它是没有任何规律的,这样它在插入的时候也没有规律,它可能就会插在这里,就会多一个分叉出来。在前边再插一条又多一个分叉,这边又多一个分叉。到最后可能这个节点它就保存了一条数据,这节点它也就保存了一个一条条数据。这样就会造成了一个配置之间的浪费,而betray就是因为这个原因而导致节点增多,层级增多的,所以不会用UUID来当主键

  • 为什么不建议写select * ?

    要避免回表,减少一次查询

  • 为什么inno DB一定要建立一个主键索引?

    主键索引它下边直接保存了数据。而非主键索引,它下边表保存的是标识,当查到标识之后,还要回表到主键索引来查询数据。所以它一定要建立主键索引

  • 什么是回表?

    inno DB索引获取的过程来看一下。首先是主键索引,然后主键索引它最下面直接保存了真正的数据。这边是根据name创建的索引。在name索引中他拿到主键值,再通过主键值到主键索引中获取数据。那么这一步到主键索引中获取数据就是回表。因为回表它多一步操作,所以咱们要尽量的避免回表

  • 什么是索引覆盖?

    所查询的字段是建立索引的字段,就不会回表查询其他字段,所以可以考虑将查询的列创建组合索引,避免回表操作,这样就会增加效率。不过也不能一直追求索引覆盖,需要评估,不然索引数据就会越来越大,也会影响效率的。

  • 什么是最左原则?

    查询语条件按照组合索引的顺序从左到右去匹配索引字段

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学