mysql 索引 二叉树_MySQL 的索引,为什么是 B+而不是平衡二叉树
数据库为什么使用 B+ 树?
前言
讲到索引,第一反应肯定是能提高查询效率。例如书的目录,想要查找某一章节,会先从目录中定位。如果没有目录,那么就需要将所有内容都看一遍才能找到。
索引的设计对程序的性能至关重要,若索引太少,对查询性能受影响;而如果索引太多,则会影响增/改/删等的性能。
知识点
MySQL 中一般支持以下几种常见的索引:
B+树索引
全文索引
哈希索引
我们今天重点来讲下 B+树索引,以及为什么要用 B+树来作为索引的数据结构。
B+树索引并不能直接找到具体的行,只是找到被查找行所在的页,然后 DB 通过把整页读入内存,再在内存中查找。
1. 与二叉树相比
二叉树相比于顺序查找的确减少了查找次数,但是在最坏情况下,二叉树有可能退化为顺序查找。而且就二叉树本身来说,当数据库的数据量特别大时,其层数也将特别大。二叉树的高度一般是 log_2^n,B 树的高度是 log_t^((n+1)/2) + 1,其高度约比 B 树大 lgt 倍。n 是节点总数,t 是树的最小度数。
2. 与 B树相比
B 树在提高 IO 性能的同时,并没与解决元素遍历时效率低下的问题,正是为了解决这个问题,B+数应运而生。B+数只需遍历叶子节点即可实现整棵树的遍历,而 B 树必须使用中序遍历按序扫库,B+树支持范围查询非常方便。这才是数据库选用 B+树的主要原因。
另外,最后说一下,并不是说 B+树就比 B 树好,有很多基于频率的搜索是选用 B树,越频繁 query 的结点越往根上走,前提是需要对 query 做统计,而且要对 key做一些变化。
无论是 B 树还是 B+树由于前边几层反复 query,因此早已被加载入内存,不会出现读磁盘 IO。一般启动的时候,就会主动换入内存。在内存中 B+树并没有优势,只有在磁盘中 B+树的威力才能显现。
采用 B+ 树的索引结构优点:
B+树的高度一般为 2-4 层,所以查找记录时最多只需要 2-4 次 IO,相对二叉平衡树已经大
大降低了。
范围查找时,能通过叶子节点的指针获取数据。例如查找大于等于 3 的数据,当在叶子节点
中查到 3 时,通过 3 的尾指针便能获取所有数据,而不需要再像二叉树一样再获取到 3 的
父节点。
总结:
1)二叉查找树(BST):解决了排序的基本问题,但是由于无法保证平衡,可能退化为链表
2)平衡二叉树(AVⅥL):通过旋转解决了平衡的问题,但是旋转操作效率太低
3)红黑树:通过舍弃严格的平衡和引入红黑节点,解决了 AⅥ旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO 次数太多
4)B 树:通过将二叉树改为多路平衡查找树,解决了树过高的问题
5)B+树:在 B 树的基础上,将非叶节点改造为不存储数据的纯索引节点,进一步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加高效。
mysql 索引 二叉树_MySQL 的索引,为什么是 B+而不是平衡二叉树相关推荐
- mysql 索引原理_MySQL InnoDB索引原理和算法
也许你经常用MySQL,也会经常用索引,但是对索引的原理和高级功能却并不知道,我们在这里一起学习下. InnoDB存储索引 在数据库中,如果索引太多,应用程序的性能可能会受到影响:如果索引太少,又会对 ...
- mysql 字符串 底层_Mysql 的索引底层原理及数据结构详解
Mysql 的索引底层原理 1.什么是索引? 索引是一种排好序的数据结构,mysql目前默认使用的是b+树. 2.为什么使用b+树? 例如表table 数据 id name 1 zs 2 ls 3 s ...
- mysql 堆表_Mysql聚集索引和非聚集索引(堆组织表和索引组织表)
Mysql聚集索引和非聚集索引(堆组织表和索引组织表) 1.堆组织表(HOT)和索引组织表(IOT)有什么区别? myisam使用的堆组织表(Heap Organize Table, HOT),没有聚 ...
- mysql常见的索引类型_mysql 常用索引类型
一.索引的类型 mysql索引的四种类型:主键索引.唯一索引.普通索引和全文索引.通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力.索引优化时mysql中的一种优化方式.索引的作 ...
- java中mysql数据库原理_MySql数据库索引原理
本文主要是阐述索引机制,主要是说明存储引擎Innodb 第一部分主要从及理论层面讨论MySQL索引的数理基础. 第二部分结合MySQL数据库中InnoDB数据存储引擎中索引的实现讨论聚集索引.非聚集索 ...
- mysql 查看索引深度_mysql 学习 - 索引深度理解
使用索引的代价 在熟悉了B+树索引原理之后,本篇文章的主题是唠叨如何更好的使用索引,虽然索引是个好东西,可不能乱建,在介绍如何更好的使用索引之前先要了解一下使用这玩意儿的代价,它在空间和时间上都会拖后 ...
- mysql 联合索引 性能_mysql:联合索引及优化
命名规则:表名_字段名 1.需要加索引的字段,要在where条件中 2.数据量少的字段不需要加索引 3.如果where条件中是OR关系,加索引不起作用 4.符合最左原则 尽量不要用or,如果可以用un ...
- mysql的存储过程和索引区别_mysql查看索引与存储过程
mysql查看索引与存储过程创建索引: CREATE INDEX可对表增加普通索引或UNIQUE唯一索引. CREATE INDEX index_name ON table_name (column_ ...
- mysql添加索引后查询先用索引吗_mysql 添加索引后 在查询的时候是mysql就自动从索引里面查询了。还是查询的时候有单 独的参数查询索引?...
满意答案 llt1711 2014.06.20 采纳率:49% 等级:9 已帮助:614人 MYSQL创建索引对索引使用方式分两种: 1 由数据库查询优化器自动判断否使用索引: 2 用户写SQL ...
最新文章
- java severlet教程_javaweb-severlet
- python 装饰器 二 (装饰带参数的函数)
- Java设计模式(五):单例设计模式
- linux下tty, ttyn, pts, pty, ttySn, console理解
- 大厂与小厂工作的选择
- ERP技术的新方向——智能客户端
- maven仓库执行脚本(clearLastUpdated.bat)
- CMake,win10,64位,简单配置测试
- c#重点知识解答(五)
- 站立会议(11月23日
- 计算机操作系统第一章测试题及答案
- 曲线运动与万有引力公式_【知识总结】物理必修二曲线运动与万有引力相关公式和规律...
- 各地前端工资是多少?三线城市的前端有多少
- 【深度学习实验报告】实验 1:PyTorch 使用简介
- 常用的android脱壳工具,Android万能脱壳机
- LTM系统并联接入方式数据包交互分析
- 我的新书——《PHP程序员面试笔试宝典》
- 交叉编译工具的使用说明
- Devc++运行窗口中文乱码怎么办?
- 门德尔松 E小调小提琴协奏曲 个人赏析
热门文章
- python数据分析基础 余本国_Python数据分析基础
- 小程序实现瀑布流,获取图片高度分成两组数据的函数封装代码
- iOS直播(三)GPUImage音视频采集并写入文件
- 按照文字内容动态设置TableViewCell的高度
- 【iOS】Socket/TCP 通信 发送 NSString 字符串格式数据
- VVeboTableView 源码解析
- Java面试题总结-Day4
- oracle 内存分配和调优 总结
- 经典算法题每日演练——第六题 协同推荐SlopeOne 算法
- UnicodeDecodeError: ‘ascii’ codec can’t decode...: ordinal not in range(128 问题解决