什么是索引

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的索引以及它的数据结构的更多相关文章

  1. 浅谈B+树索引的分裂优化(转)

    http://www.tamabc.com/article/85038.html 从MySQL Bug#67718浅谈B+树索引的分裂优化   原文链接:http://hedengcheng.com/ ...

  2. 浅谈mysql主从复制的高可用解决方案

    1.熟悉几个组件(部分摘自网络)1.1.drbd     —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...

  3. 浅谈mysql innodb缓存策略

    浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...

  4. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

  5. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  6. 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景   Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...

  7. 浅谈MySQL索引背后的数据结构及算法

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  8. 浅谈MySQL索引背后的数据结构及算法(转载)

    转自:http://blogread.cn/it/article/4088?f=wb1 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储 ...

  9. 浅谈MySQL索引背后的数据结构及算法【转】

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

随机推荐

  1. Filter(过滤器)、ThreadLocal(本地线程)、Listener(监听器)

    Filter(过滤器) Filter过滤器它的作用是:拦截请求,过滤响应. 过滤器链 1)执行的顺序依次是: A B C Demo03 C2 B2 A2 2)如果采取的是注解的方式进行配置,那么过滤器 ...

  2. 至少要几个砝码,可以称出 1g ~ 40g 重量

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

  3. 游标长时间open导致表无法vacuum问题

    一.问题描述 用户在实际中可能会碰到类似以下 dead rows 无法 vacuum的问题,一个可能的原因是由于游标未结束的原因. test=# vacuum(verbose) t1; INFO: v ...

  4. 【Azure 环境】Azure Resource Graph Explorer 中实现动态数组数据转换成多行记录模式 - mv-expand

    问题描述 想对Azure中全部VM的NSG资源进行收集,如果只是查看一个VM的NSG设定,可以在门户页面中查看表格模式,但是如果想把导出成表格,可以在Azure Resource Graph Expl ...

  5. 使用 Elastic 技术栈构建 K8S 全栈监控 -3: 使用 Filebeat 采集 Kubernetes 集群日志

    文章转载自:https://www.qikqiak.com/post/k8s-monitor-use-elastic-stack-3/ 操作步骤 filebeat连接es使用上一步创建的secret: ...

  6. Docker 部署 RocketMQ 双主双从模式( 版本v4.7.0)

    文章转载自:http://www.mydlq.club/article/96/ 系统环境: 系统版本:CentOS 7.8 RocketMQ 版本:4.7.0 Docker 版本:19.03.13 一 ...

  7. WPF绘制圆形调色盘

    本文使用writeableBitmap类和HSB.RGB模式来绘制圆形的调色盘. 开源项目地址:https://github.com/ZhiminWei/Palette RGB为可见光波段三个颜色通道 ...

  8. Tubian0.43,完善对QQ微信的支持

    Sourceforge.net下载:https://sourceforge.net/projects/tubian/ 123网盘下载: https://www.123pan.com/s/XjkKVv- ...

  9. [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP

    题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...

  10. 关于aws-SecurityGroup-安全组策略的批量添加的方法记录

    因一些服务的客户端网络地址段计划变更,会影响到aws上配置这这些网段安全组策略所绑定的资源 因此需要先整理包含了出那些服务的网络地址段的安全组 然后根据旧网段的策略信息,将新的地址段给添加上,待后续正 ...