• b+树的查找过程:如上图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,
                                      内存时间因为非常短(相比磁盘IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块
                                      3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分法查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万
                                      的数据。
  • b+树的性质:
    • IO次数取决于b+树额高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m。则有h=log(m+1)N,当数据量N一定的情况下,m越大,h越小;而m=磁盘块的大小/数
      据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,
      也是为什么b+树要求把真实数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。
    • 当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+树是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优
      先比较name确定下一步的搜索方向,如果name相同再依次比较age和sex,最后得到检索的数据。索引的最左匹配属性。
  • 建索引的几大原则:
    • 最左前匹配原则
    • =和in可以乱序
    • 尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少
    • 索引列不能参与计算
    • 尽量的扩展索引,不要新建索引
  • 慢查询优化基本步骤:
    • 0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
      1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
      2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)rows
      3.order by limit 形式的sql语句让排序的表优先查
      4.了解业务方使用场景
      5.加索引时参照建索引的几大原则
      6.观察结果,不符合预期继续从0分析

数据库索引的数据结构b+树的更多相关文章

  1. 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...

  2. 数据库索引使用数据结构及算法, 及MySQL不同引擎索引实现

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

  3. MySQL索引的数据结构-B+树介绍

    目录 一.树 二.B+树 2.1 B+树性质 三.聚集索引和辅助索引 3.1 聚集索引 3.2 辅助索引 3.3 聚集索引和非聚集索引的区别 四.再看B+树 4.1 B+树的插入操作 4.2 B+树的 ...

  4. B树和B+树对比,为什么MySQL数据库索引选择使用B+树?

    一 基础知识 二叉树 根节点,第一层的节点 叶子节点,没有子节点的节点. 非叶子节点,有子节点的节点,根节点也是非叶子节点. B树 B树的节点为关键字和相应的数据(索引等) B+树 B+树是B树的一个 ...

  5. 数据库索引B-树和B+树

    一开始学习数据结构的时候,主要学习的是数组,队列,链表,队列,栈,树这些数据结构,其中树主要学习二叉树,平衡二叉树,二叉搜索树等这些子节点最多只有两个的树结构.但是,当我们接触数据库的时候,你会发现数 ...

  6. 数据库索引的基石----B树

    数据结构相对来说比较枯燥, 我尽量用最易懂的话,来把B树讲清楚.学过数据结构的人都接触过一个概念二叉树,简单来说,就是每个父节点最多有两个子节点.为了在二叉树上更快的进行元素的查找,人们通过不断的改进 ...

  7. MySQL数据库索引之B+树

    一.B+树是什么 B+ 树是一种树型数据结构,通常用于数据库和操作系统的文件系统中.B+ 树的特点是能够保持数据稳定有序,其插入与修改操作拥有较稳定的对数时间复杂度.B+ 树元素自底向上插入,这与二叉 ...

  8. 深入理解数据库索引采用B树和B+树的原因

    前面几篇关于数据库底层磁盘文件读取,数据库索引实现细节进行了深入的研究,但是没有串联起来的讲解为什么数据库索引会采用B树和B+树而不是其他的数据结构,例如平衡二叉树.链表等,因此,本文打算从数据库文件 ...

  9. 数据库索引 B+树

    问题1.数据库为什么要设计索引?索引类似书本目录,用于提升数据库查找速度.问题2.哈希(hash)比树(tree)更快,索引结构为什么要设计成树型?加快查找速度的数据结构,常见的有两类:(1)哈希,例 ...

随机推荐

  1. MySQL-8.0.11与Navicat Premium安装教程

    1. 下载MySQL 下载地址: https:////dev.mysql.com/downloads/mysql/ 百度云 链接:https://pan.baidu.com/s/1bxAtnvChZZ ...

  2. Python全栈之路----常用模块----hashlib加密模块

    加密算法介绍 HASH       Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...

  3. 常用的phpdoc标签

    标签 说明 @access public|private|protected 描述了访问级别.当使用反射技术时,这个标签不是很有用,这是因为API能够自动获取这一特性.在PHPDoc中,用它可略去私有 ...

  4. vue环境配置

    wind系统下需要安装node.js 和git 1.安装npm 因为淘宝镜像较快,所以可以使用淘宝镜像安装npm npm install -g cnpm --registry=https://regi ...

  5. 取MySQL结果集的第一条记录

    select * FROM SU_supplycontract t WHERE supplyContractCode="CRM20180813002" limit 1;

  6. CNN试验记录

    CIFAR-10 图像处理:(预处理还是很重要的) 数据随机裁剪,填充0 依概率p水平翻转 1.VGG16 SGD lr=0.01 momentum 0.9 weight_decay=0.0001 e ...

  7. MVC Model验证

    [Required(ErrorMessage = "证件号不能为空!")] [RegularExpression(@"(^\d{18}$)|(^\d{15}$)|(^\d ...

  8. 网络编程一定要看过的socket另一座大山

    上次的socket还有很多坑.但是总是在不断的改进的.下面就来看看一个升级版的内容 import socket server = socket.socket() ip_port = ("19 ...

  9. ubuntu typora使用学习

    typora使用方法 标题: 对于标题,直接用ctrl+对应数字就是第几级标题 文字格式: ctrl+B/I/U 进入加粗/倾斜/下划模式,不需要符号键入 居中的话 用 CENTER 列表引用: 可直 ...

  10. 迁移32位下的旧代码到64位sever遇到过的两个很诡异的问题

    一个是GetHashCode,这个方法是返回一个int值,在32位系统里,都是正值,但在64位系统里会返回负值. 另一个问题是DataTable的Sort属性,在没有显示写明升序或降序的情况下,在32 ...