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 树的基础上,将非叶节点改造为不存储数据的纯索引节点,进一步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加高效。
相关文章:

Spring Boot 2 快速教程:WebFlux 快速入门(二)
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 02:WebFlux 快速入门实践 文章工程: JDK 1.8…

关于捕获键盘信息的processDialogkey方法
在一些控件里的keydown方法,没有办法捕获所有的按键消息 比如自己写一个窗体控件库,继承了UserControl 但是没有办法捕获一些键,比如方向键等 所以必须重载 processDialogkey 方法 processDialogkey 的描述 在msdn中是这样的 在消息预处理过程…

Visual Studio进行Web性能测试- Part III
原文作者:Ambily.raj 对于一个多用户的应用程序,性能是非常重要的。性能不仅是执行的速度,它包括负载和并发方面。Visual Studio是可以用于性能测试的工具之一。Visual Studio Test版或Visual Studio 2010旗舰版为自动化测试提供了支持。 介绍…

php mysql source_Mysql数据库导入命令Source详解
Mysql数据库导入命令Source详解几个常用用例:1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u root -p dataname >dataname.sql这个时候会提示要你输入root用户名的密码,输入密码后dataname数据库就成功备份在mysql/bin/目录中.…

课堂练习(续)
源程序: Text_2.java import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.te…

任务二:1、选择器 2、连接集中状态的顺序 3、浮动的用发和原理 4、盒模型在IE和Google等不同浏览器的区别与联系...
1、选择器类型 标签选择器,类选择器,ID选择器,组合选择器,伪类和伪元素,属性选择器,子选择器,同胞选择器, :not()选择器 1、同胞选择器 相邻同胞标签: h2 p{ color:red…

struct发送与显示中文
中文的编码显示常常是一个让人头痛的问题,网络传输的时候中文也会变成二进制的流,接收方显示就成了一个大问题。 今天使用python的struct模块来对数据封包解包,同样有这个问题。解决方法是:一般会把python代码文件声明为utf-8编码…

mysql5.7.22密码设置_mysql5.7.22版本修改root密码
mysql5.6之前修改密码(字段password)mysql> use mysql;mysql> update user set passwordpassword(‘123‘) where user‘root‘ and host‘localhost‘;mysql> flush privileges;mysql 5.7.22版本修改密码(字段是authentication_string)mysql> use mysql;mysql>…

配置 php-fpm 监听的socket
一般现在我们配置的PHP的web环境,如LNMP(linuxNginxMysqlPHP), 这里linux可能是centos, ubuntu..., 数据库可能是mysql, postgresql, sql server等。。 在服务器上安装PHP-FPM, nginx后, 我们要配置Nginx的http模块&am…

laravel基础课程---8、laravel响应和视图(响应是什么)
laravel基础课程---8、laravel响应和视图(响应是什么) 一、总结 一句话总结: 就是向请求返回的响应数据(一般为html(视图),当然也可以是变量值):所有的路由及控制器必须返…

ios应用内购买
参考: 1、http://troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough/ 2、http://iosdeveloper.diandian.com/post/2011-08-26/4366441转载于:https://www.cnblogs.com/foxmin/archive/2012/09/08/2676580.html

mysql查询解析过程_MySQL查询执行过程详解
查询是用户通过设置某些查询条件,从表或其他查询中选取全部或者部分数据,以表的形式显示数据供用户浏览。查询是一个独立的、功能强大的、具有计算功能和条件检索功能的数据库对象。MySQL数据库中,MySQL查询同样是数据库的核心操作࿰…

.net erp(办公oa)开发平台架构之流程服务概要介绍
背景 搭建一个适合公司erp业务的开发平台。 架构概要图: 流程引擎开发平台: 包含流程引擎设计器,流程管理平台,流程引擎服务。目前只使用单个数据库进行管理。 流程引擎设计器 采用silverlight进行开发,本质是对流程…

数据分析-pca协方差
协方差是反映的变量之间的二阶统计特性,如果随机向量的不同分量之间的相关性很小,则所得的协方差矩阵几乎是一个对角矩阵。转载于:https://www.cnblogs.com/erweiyang/archive/2012/09/08/2676997.html

在javascript中判断类型
String 一个字符串始终是一个字符串,所以这一块是很容易。除非使用new(new String)调用,否则typeof将返回“object”。所以也要包含那些可以使用的字符串instanceof。 // Returns if a value is a string function isString (valu…

mysql中日期判断的函数_MySql判断汉字、日期、数字的函数
几个平常用的mysql函数 /***************************************************** 1.判断字符串是否为汉字 返回值:1-汉字 0-非汉字 *****************************************************/ DROP FUNCTION IF EXISTS fc_is_hanzi; CREATE FUNCTION fc_is_h几个平常…

c#.net调用pdf2swf.exe将pdf文件转换为swf,vs中运行正常,布署IIS服务器部署转换后文字部分为空白...
这个是权限问题, 需要在应用程序池中高级设置,将标识改为LocalSystem 转载于:https://www.cnblogs.com/shy1766IT/p/5114971.html

云计算开发要学习哪些东西?云计算开发的内容
云计算是一种基于互联网的计算方式,要实现云计算则需要一整套的技术架构去实施,包括网络、服务器、存储、虚拟化等等。 云计算目前分为公有云和私有云。两者的区别只是提供的服务的对象不同,一个是企业内部使用,一个则是面向公众。…

XHTML+CSS3(Chapter 1)
HTML5 Reference document: http://www.w3school.com.cn/html5/html_5_intro.asp 1. Use <video> to display some video in html (mp4. ogg.) <video src"movie.ogg" controls"controls"> </video> 2. Use <audio> to play …

oracle重建实例_记一次误删Oracle控制文件并恢复过程
概述当你在数据库运行时误删除了控制文件怎么办?很不幸有一次我就有这个情况,虽然是测试环境,这里因为我有事先把控制文件分别备份,所以恢复还是比较简单的。下面简单记录下怎么恢复。问题控制文件版本不一致一般是因为在实例运行时删除了控制…

成都Uber优步司机奖励政策(1月9日)
1月9日 奖励政策滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfryf/p/4612609.html 优步奖励低/不挣钱/怎么办?看这里:http://www.c…

vim-map
vim-map 软件版本: ubuntu10.04 Linux version 2.6.32-42-generic VIM - Vi IMproved 7.2目录: 1. 简介 2. 映射与运行模式的关系 3. 例子 4. 其他 1. 简介 如果想让 vim 成为你手中的利器,vim 的 map 功能就不得不学&…

Java并发面试,幸亏有点道行,不然又被忽悠了
2019独角兽企业重金招聘Python工程师标准>>> 前言 面试Java,必然要被问Java内存模型和Java并发开发。我被问到的时候,心里慌得一批,“额,是在《Thinking in Java》里面写的吗?果然每天增删改太low了” 要了…

mysql减少锁等待_降低锁竞争 减少MySQL用户等待时间
【IT168 技术】通过锁机制,可以实现多线程同时对某个表进行操作。如下图所示,在某个时刻,用户甲、用户乙、用户丙可能会同时或者先后(前面一个作业还没有完成)对数据表A进行查询或者更新的操作。当某个线程涉及到更新操作时,就需要…
UML中的六种关系的比较与学习
通过不断的学习并绘制UML图,整个画图的过程中深刻体会到其核心部分还是理解事物之间的关系,总结六大关系来深入学习,主要关系有六种:继承、实现、依赖、关联、聚合、组合。 区别于联系: 1.继承(泛华&#x…

spark—3(Spark Scheduler)
2019独角兽企业重金招聘Python工程师标准>>> Spark的核心是根据RDD来实现的,Spark Scheduler则为Spark核心实现的重要一环,其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据,根据RDD的依赖关系构建…

Tomcat手动配置简述【查询留存】
一、设置JAVA的环境变量JAVA_HOME 略 二、设置Tomcat的环境变量 一次性全配置了 Tomcat的根目录,例如【E:\tomcat-6.0.35】 创建下列环境变量: CATALINA_HOME: E:\tomcat-6.0.35 CATALINA_BASE: E:\tomcat-6.0.35 TOMCAT_HOME: E:\tomcat-6.0.35 然后修改…

linux mysql 不稳定_linux,mysql:今天写出一个十分弱智的bug!
今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫:selectrecord.a, y.c from ( selecta,b from xorde…

IOS XML解析
<?xml version "1.0" encoding "utf-8"?> <video>小黄人</video> <video></video> <video/> <videos> <video> </video> </videos> 不能相互嵌套。 xml中的所有空格和空行都会当成字符来…

BAT架构师分享之:大型网站技术架构
早期的网站为了节省成本一般会设计成集中式系统,应用程序、数据库等都部署在一台服务器上。 但随着业务的快速度发展,逐渐出现瓶颈,按一定原则**(应用拆分、服务拆分、数据拆分、应用解耦)**,向分布式系统转…