mysql索引为啥要选择B+树 (上)
不知道你有没有这种感觉,那些所谓的数据结构和算法,在日常开发工作中很少用到或者几乎不曾用到,可能只是在每次换工作准备面试的时候才会捡起来学习学习。
那我希望今天这篇文章能让你对数据结构的具体应用能有个初步的概念,就从我们每天都在用的 mysql 数据库说起吧。
今天这个标题,严格来说其实是不正确的,我在前面的文章中有这么解释过:
首先,mysql 主要是由 server 层和存储层两部分构成的。server >层主要包括连接器、查询缓存,分析器、优化器、执行器。存储层主要是用来存储和查询 数据的,常用的存储引擎有 InnoDB、MyISAM,MySQL 5.5.5版本后使用 InnoDB >作为默认存储引擎。
这篇文章我们主要讨论 mysql 的存储层,不同的存储引擎其底层的数据结构是不一样的,我们这里就以默认的 InnoDB 为例,所以严格来说应该是 InnoDB 为啥要选择 B+ 树这种数据结构来存储数据。
在文章正式开始之前,你先要知道 mysql 中的 InnoDB 在底层是采用 B+ 树这种数据结构来存储数据的。你先记住就好了,下面我们再来一步一步解释为什么。
- 几种常见的数据结构
首先你要知道,mysql 的索引主要是为了提高查询效率的,那一定得找一个合适的数据结构来存储数据,哈希表、数组、二叉搜索树这三种常见的数据结构都可以提高查询效率。
- 哈希表
哈希表就是一种以键值对来存储数据的结构,你可以通过一个 key 就可以很快的查询出对用的 value 值。哈希表主要是利用了数组的随机访问特性,实现思想主要是通过一个哈希函数把 key 转换成一个哈希值,这个哈希值就对应数组中的某个下标。
但是由于哈希表是无序的,区间查询效率会非常的慢,所以哈希表通常只用于查询单个值。
- 有序数组
数组就好说了,数组具有连续性和随机访问特性,因此数组都能很高效的进行单个等值查询和区间查询,但是 mysql 不仅仅是查询数据,还会有插入和删除数据的操作。
在有序数组中插入或删除一个数据会需要批量移动数组中其他数据,这是一个不小的消耗,影响性能。因此有序数组适合处理静态数据,比如一些过往的不会再修改的数据。
在这里你可能会问,既然哈希表其实也是利用了数组的特性,那有了数组为啥还需要哈希表呢。是因为数组下标 key 只能是数字,而哈希表可以支持字符串 key,哈希函数可以把这个 key 转换成一个数组下标。
同时,不同的 key 如果通过哈希函数转换成了相同的数组下标,这就会造成冲突,在哈希表中一般会通过再拉出一个链表来保存这个冲突的值。
关于哈希表这里就不再多说了,后面的文章再详细解释哈希表的原理以及相关应用。
- 二叉搜索树
注意,二叉搜索树和二叉树不一样,二叉树是指每个节点的左儿子小于父节点,父节点又小于右儿子,即二叉搜索树的中序遍历就是一个有序序列。
由于索引不仅仅是存在内存中,还会存储在硬盘中,因此就会涉及到 IO 性能了,就要求树的高度不能太高。实际上 B+ 树就是通过二叉搜索树推演改进的,我将在后面的文章再详细解释这个改进过程。
- 小结
哈希表适合等值查询,由于是无序的,区间查询会很慢。
有序数组适合等值和区间查询,但是数组具有连续性,插入和删除操作都可能需要移动其他元素。
二叉搜索树由于树的高度,区间查询需要中序遍历,都会导致查询效率很慢。
注意,在一些文章中经常会把 B+ 树说成 B 树或者 B-tree,这其实是错误的,B 树和 B+ 是两种不同的树,B+ 树是 B 树的一个优化,后面的文章我会再详细解释这个优化过程。
而且 B- 树其实也就是 B 树,这个符号并不是加减中的减号,并不是所谓的 "B 减树",只是一个连接符号而已。
这篇文章就先写到这了,希望你能有些收获,如果对你有一点点帮助,就给文章点个好看吧,感谢支持。
转载于:https://juejin.im/post/5c838173e51d450cbe06ab7f
mysql索引为啥要选择B+树 (上)相关推荐
- mysql索引为啥要选择B+树 (下)
有读者在 mysql索引为啥要选择B+树 (上) 上篇文章中留言总结了选择 B+ 树的原因,大体上说对了,今天我们再一起来看看具体的原因. 索引为什么要保存在硬盘中 首先要明白几个概念,服务器存储一般 ...
- Mysql索引数据结构有多个选择,为什么一定要是B+树呢?_面试 (MySQL 索引为啥要选择 B+ 树)
Mysql索引数据结构 下面列举了常见的数据结构 二叉树 红黑树 Hash表 B-Tree(B树) Select * from t where t.col=5 我们在执行一条查询的Sql语句时候,在数 ...
- 图解 MySQL 索引:B-树、B+树
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://tinyurl.com/y5ymnj9a 一. ...
- mysql系列十、mysql索引结构的实现B+树/B-树原理
一.MySQL索引原理 1.索引背景 生活中随处可见索引的例子,如火车站的车次表.图书的目录等.它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的 ...
- 图解MySQL索引:B-树(B+树)
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 作者:浪人 ...
- 面试官:MySQL索引为什么要用B+树实现?
原因如下 B+树能显著减少IO次数,提高效率 B+树的查询效率更加稳定,因为数据放在叶子节点 B+树能提高范围查询的效率,因为叶子节点指向下一个叶子节点 B+树是怎么来的? 在从一堆数据中查找指定的数 ...
- Mysql索引类型如何选择?
用个图温习一下索引 问题1:mysql索引类型normal,unique,full text的区别是什么? normal:表示普通索引 unique:表示唯一的,不允许重复的索引,如果该字段信息保证不 ...
- 图解 MySQL 索引:B-树、B+树,终于搞清楚了!
看了很多关于索引的博客,讲的大同小异.但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引-. 或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结 ...
- Mysql 索引为啥使用B+树?不用哈希或B树?红黑树?
哈希索引:单个记录的增删改查效率高,时间复杂度是O(1):但对于范围查询需要全表扫描: B树: 1 范围查询时效率比B+树低(B树的叶子结点缺少有序链表): 2 内部节点(非叶子结点)既存储数据也存储 ...
最新文章
- R语言使用ggplot2可视化互相覆盖的直方图实战(Overlaying histograms)
- 雷林鹏分享:PHP 5 Directory 函数
- java runnable main_Java 线程类问题写一个线程类MyThread,该线程实现了Runnable接口,写一个main方法, * 用for循...
- Easyui textbox 组件设置css样式
- jQuery-Easyui 1.2 实现多层菜单
- 使用SAP Cloud for Customer Product OData服务读取产品主数据和其图片信息
- 验证Oracle收集统计信息参数granularity数据分析的力度
- Unity3D在C#编程中的一些命名空间的引用及说明
- 部署AIX nmon监控脚本
- 关于C#窗体程序dataGridView控件的用法
- jcodec_java-jcodec-有人看过该库的文档吗?
- 详解clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop
- Python如何判断某天是星期几
- ROS学习:launch文件编写
- 【服务器数据恢复】StorNext文件系统数据恢复案例
- 山东法律学校97级二班计算机班,山东法律学校宿舍条件
- HTML5实现动态视频背景
- 第十届全球云计算大会 | 华云数据荣获“2013-2022十周年特别贡献奖”
- 完美国际2找回老账号服务器,我告诉大家一个找回账号的办法
- 真王服务器文件,虚惊后的火速报道《真王》迎来历史性更新
热门文章
- 出门问问工程副总裁黄美玉入选IEEE Fellow,曾担任微软Cortana首席NLP科学家
- PhoenixGo战胜绝艺,腾讯包揽AI围棋大赛前两名
- 资源 | 想用Python学机器学习?Google大神替你写好了所有的编程示范代码
- AI每日看点 | 吉利收购飞行汽车公司;传华为暂停向高通支付专利费;高通拒绝博通收购邀约
- 深入理解Linux I/O系统
- SpringBoot静态获取 bean的三种方式,你学会了吗?
- JDK 序列化, 碰到serialVersionUID 不一致问题,怎么处理?
- 为什么阿里巴巴禁止使用Apache Beanutils进行属性的copy?
- 一个基于SpringBoot + Mybatis + Vue的代码生成器
- 腾讯推出高性能 RPC 开发框架