浅谈MYSQL的索引以及它的数据结构
什么是索引
mysql的数据是持久化到磁盘的,写SQL查询数据也就是在磁盘的某个位置查找符合条件的数据,但是磁盘IO比起内存效率是极慢的,特别是数据量大的时候,这时候就需要引入索引来提高查询效率;
在我看来索引是为了提高查询效率而诞生的一种手段,借助合适的数据结构将数据有规律的沉淀下来,使得查询的时候能尽量减少磁盘IO快速返回;也可以类比书本或字典的目录,能快速定位数据
索引的类型
mysql的索引可分为:主键索引(唯一且非空)、唯一索引(可为空)、全文索引、联合索引以及普通索引(普通列做索引)
索引的优点
- 减少磁盘IO次数,提升查询效率
- 将随机IO变成顺序IO
索引的数据结构
众所周知,mysql innerDb和myIsam引擎索引的数据结构都是B+树,使用B+树作为索引的数据结构主要是因为相同的磁盘IO次数下B+树的查询表现远高于其他数据结构,并且B+树的叶子节点是收尾相连的,这样更便于顺序查询;下面依次简单介绍下其他数据结构作为索引数据结构的优缺点
HASH表
首先介绍下hash算法,通过hash算法将索引列分散到hash表上去,由于hash是基于内存的,所以效率还是不错的,但是正是因为基于内存导致了其不适合大数据量的计算,浪费内存空间;并且hash算法查询时只有等值计算才会体现他的高效,对于范围查询其还是无能为力;需要注意的是,mysql的memory存储引擎索引的数据结构就是hash表
二叉树
二叉树插入数据时很容易造成树的倾斜,每次插入对应一次IO,效率低下
AVL树
平衡树在二叉树的基础上新增了左旋和右旋,但是需要确保最短子树和最长字树的高度差不大于1;当插入数据量过大时会进行很多次的旋转,导致插入速度极低;查询效率高
红黑树
红黑树相当于是AVL树的一个升级,它通过变色的操作降低了左右旋转的次数,中和了AVL树插入速度慢的缺点;红黑树的要求如下:
- 任意路径上不能有两个红色节点连续出现
- 最长子树不超过最短子树的两倍即可
- 更节点到各子节点的链路中黑色节点的数量一致
虽说红黑树提高了插入效率,但是受限于一个节点最多只有两个子节点的影响,当数据量大时还是会出现树深度过深从而增加IO次数的问题
B树
B树的每个节点可以有N个节点,这就解决了上面说的树深度的问题,B树的每个节点(包括非叶子节点)不仅会存储页码而且还会存储对应的数据;下面我们分析下B树的查询能力:
mysql是通过磁盘预读来查询数据的,每次可以读取页的整数倍,一页等于4KB,inderDb默认读的是16KB,我们假设一行数据占用1KB的内存并且忽略节点上页面占用的空间,这样三次磁盘IO的话B树能读出161616=4096条数据,效率并不是很理想,并不能满足日常工作中的实际需求
B+树
B+树与B树的区别在于,B+树的非叶子节点不存储数据,数据均存储在叶子节点,且叶子节点收尾相连;我们同样来计算下B+树的查询能力:
由于非叶子节点不存储数据只存储页码,假设一个页码占用10个字节的内存,这样一个磁盘块可以容纳的数据为:(16 * 1000)/10=1600条,假设同样进行三次IO,那么能支持查询的数据量是:1600 * 1600 * 16=40960000,轻松达到千万级别;
浅谈MYSQL的索引以及它的数据结构的更多相关文章
- 浅谈B+树索引的分裂优化(转)
http://www.tamabc.com/article/85038.html 从MySQL Bug#67718浅谈B+树索引的分裂优化 原文链接:http://hedengcheng.com/ ...
- 浅谈mysql主从复制的高可用解决方案
1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...
- 浅谈mysql innodb缓存策略
浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...
- 浅谈mysql配置优化和sql语句优化【转】
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...
- 浅谈MySQL索引背后的数据结构及算法
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- 浅谈MySQL索引背后的数据结构及算法(转载)
转自:http://blogread.cn/it/article/4088?f=wb1 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储 ...
- 浅谈MySQL索引背后的数据结构及算法【转】
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
随机推荐
- Filter(过滤器)、ThreadLocal(本地线程)、Listener(监听器)
Filter(过滤器) Filter过滤器它的作用是:拦截请求,过滤响应. 过滤器链 1)执行的顺序依次是: A B C Demo03 C2 B2 A2 2)如果采取的是注解的方式进行配置,那么过滤器 ...
- 至少要几个砝码,可以称出 1g ~ 40g 重量
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...
- 游标长时间open导致表无法vacuum问题
一.问题描述 用户在实际中可能会碰到类似以下 dead rows 无法 vacuum的问题,一个可能的原因是由于游标未结束的原因. test=# vacuum(verbose) t1; INFO: v ...
- 【Azure 环境】Azure Resource Graph Explorer 中实现动态数组数据转换成多行记录模式 - mv-expand
问题描述 想对Azure中全部VM的NSG资源进行收集,如果只是查看一个VM的NSG设定,可以在门户页面中查看表格模式,但是如果想把导出成表格,可以在Azure Resource Graph Expl ...
- 使用 Elastic 技术栈构建 K8S 全栈监控 -3: 使用 Filebeat 采集 Kubernetes 集群日志
文章转载自:https://www.qikqiak.com/post/k8s-monitor-use-elastic-stack-3/ 操作步骤 filebeat连接es使用上一步创建的secret: ...
- Docker 部署 RocketMQ 双主双从模式( 版本v4.7.0)
文章转载自:http://www.mydlq.club/article/96/ 系统环境: 系统版本:CentOS 7.8 RocketMQ 版本:4.7.0 Docker 版本:19.03.13 一 ...
- WPF绘制圆形调色盘
本文使用writeableBitmap类和HSB.RGB模式来绘制圆形的调色盘. 开源项目地址:https://github.com/ZhiminWei/Palette RGB为可见光波段三个颜色通道 ...
- Tubian0.43,完善对QQ微信的支持
Sourceforge.net下载:https://sourceforge.net/projects/tubian/ 123网盘下载: https://www.123pan.com/s/XjkKVv- ...
- [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP
题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...
- 关于aws-SecurityGroup-安全组策略的批量添加的方法记录
因一些服务的客户端网络地址段计划变更,会影响到aws上配置这这些网段安全组策略所绑定的资源 因此需要先整理包含了出那些服务的网络地址段的安全组 然后根据旧网段的策略信息,将新的地址段给添加上,待后续正 ...