SQL索引概念(详解B+树)

news2025/1/12 18:52:58

SQL索引

  • 定义
  • 分类
    • 复合索引特性
      • 复合索引最左特性(原则)
      • 原理
  • 索引及其扫描类型
  • 索引的优缺点
    • 优点:
    • 缺点:
  • 索引工作原理
    • BTree+索引
    • 怎么判断是否创建索引?
    • 为什么Mysql用B+树做索引而不用B-树或红黑树
    • 为什么索引快?

定义

索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(额外的存储空间),这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高效的查找算法。这种数据结构就叫做索引。
在这里插入图片描述
一般来说索引本身也很大,不可能全部存储在内存中,因此往往以索引文件的形式存放在磁盘中。目前大多数索引都采用BTree树方式构建。

分类

  • 单值索引:一个索引只包括一个列,一个表可以有多个列
  • 唯一索引:索引列的值必须唯一,但允许有空值
  • 复合索引(联合索引):一个索引同时包括多列

复合索引特性

复合索引最左特性(原则)

在Mysql建立复合索引时有最左前缀的原则。当建立一个复合索引(col1,col2,col3)时,实际上建立了三个索引,即(col1)、(col1,col2)、(col1,col2,col3)。

原理

复合索引的结构是B+树,比如(name,age,sex)的时候,b+树是按照从左到右的顺序来建立搜索树的,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex。当age或者sex字段缺失时,b+树就不知道第一步该查哪个节点,所以只能把名字name的数据都找到,即索引的最左匹配特性。

索引及其扫描类型

type:

  • ALL 全表扫描,没有优化,最慢的方式
  • index 索引全扫描
  • range 索引范围扫描,常用语<,<=,>=,between等操作
  • ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
  • eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
  • const 当查询是对主键或者唯一键进行精确查询,系统会把匹配行中的其他列作为常数处理
  • null MySQL不访问任何表或索引,直接返回结果
  • System 表只有一条记录(实际中基本不存在这个情况)

性能排行:
System > const > eq_ref > ref > range > index > ALL

possible_keys:显示可能应用在这张表中的索引
key:真正使用的索引方式

索引的优缺点

优点:

  • 索引是数据库优化
  • 表的主键会默认自动创建索引
  • 大量降低数据库的IO磁盘读写成本,极大提高了检索速度
  • 索引事先对数据进行了排序,降低查询是数据排序的成本,降低CPU的消耗

缺点:

  • 索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间
  • 索引表中的内容,在业务表中都有,数据是重复的,空间是“浪费的”
  • 虽然索引大大提高了查询的速度,但反向影响了增、删、改操作的效率。如表中数据变化之后,会造成索引内容不正确,需要更新索引表信息,如果数据量非常巨大,重新创建索引的时间就大大增加
  • 随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去更新索引

索引工作原理

BTree+索引

在这里插入图片描述

  • 浅蓝色: 磁盘块
  • 深蓝色: 数据项
  • 黄色: 数据的指针

真实的数据仅在叶子节点中: 3, 5, 9, 10, 13, 15, 28, 29, 36, 60, 75, 79, 90,99

查找过程: 假如要找29

  • 从树根开始,即先把磁盘块1中内容读到内存中,发生一次IO
  • 确定29在(17,35)之间,锁定磁盘块1中的P2指针
  • 根据P2指针,找到磁盘块3,读取到内存中,发生二次IO
  • 29在(26,30)之间,锁定磁盘块3的P2指针
  • 通过磁盘3的P2指针,将磁盘块8的内容读取到内存中,发生第三次IO
  • 最终找到数据29,查询结束,总共发生三次IO

怎么判断是否创建索引?

创建索引:

  • 主键约束默认建立唯一索引
  • 频繁出现在where查询条件的字段
  • 多表查询中与其它表进行on关联的字段,外键关系
  • 单列索引/复合索引的选择? 高并发下倾向于创建复合索引
  • 查询中经常用来排序的字段
  • 查询中经常用来统计或者分组字段

不创建索引:

  • 频繁更新的字段: 每次更新都会影响索引树
  • where条件查询中用不到的字段
  • 表记录太少
  • 经常增删改的表: 更新了表,索引也得更新才行
  • 注意: 如果一张表中重复的记录非常多,为它建立索引就没有太大意义

为什么Mysql用B+树做索引而不用B-树或红黑树

  • B+ 树只有叶节点存放数据,其余节点用来索引
  • B- 树是每个索引节点都会有Data域

从Mysql(InnoDB)的角度来看,B+树是用来充当索引的,一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上。

那么Mysql如何衡量查询效率呢?
磁盘IO次数。B-树/B+树的特点就是每层节点数目非常多,层数很少,目的就是为了就少磁盘IO次数,但是B-树的每个节点都有data域(指针),这无疑增大了节点大小,说白了增加了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多,一次IO多耗时),而B+ 树除了叶子节点其它节点并不存储数据,节点小,磁盘IO次数就少。这是优点之一。

另一个优点是:B+树所有的Data域在叶子节点,一般来说都会进行一个优化,就是将所有的叶子节点用指针串起来。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问。在数据库中基于范围的查询是非常频繁的,而B树不支持这样的遍历操作。

B树相对于红黑树的区别:
平衡二叉树AVL和红黑树基本都是存储在内存中才会使用的数据结构。在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况。为什么会出现这样的情况,我们知道要获取磁盘上数据,必须先通过磁盘移动臂移动到数据所在的柱面,然后找到指定盘面,接着旋转盘面找到数据所在的磁道,最后对数据进行读写。磁盘IO代价主要花费在查找所需的柱面上,树的深度过大会造成磁盘IO频繁读写。根据磁盘查找存取的次数往往由树的高度所决定,所以,只要我们通过某种较好的树结构减少树的结构尽量减少树的高度,B树可以有多个子女,从几十到上千,可以降低树的高度。

同时,数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

为什么索引快?

  • 排序
  • 树形结构,类似二分查找

3层的BTree可以表示上百万的数据,如果上百万条数据,查找只需要三次IO,性能提高将是巨大的,如果没有索引每次查找都要发生一次IO,那么总共就需要百万次的IO,显然成本是非常高的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】认清带头双向循环链表的庐山真面目

目录前言一、带头双向循环链表的介绍二、带头双向循环链表的类型重定义1.对数据类型进行重定义2.链表结点结构3.结点类型重定义三、常见函数操作的实现1.声明2.定义1. 申请新节点2. 初始化3. 销毁链表4. 打印链表5. 尾插数据6. 尾删数据7. 头插结点8.头删结点9. 在指定的位置前…

嵌入式开发的程序架构

前言 在嵌入式软件开发&#xff0c;包括单片机开发中&#xff0c;软件架构对于开发人员是一个必须认真考虑的问题。 软件架构对于系统整体的稳定性和可靠性是非常重要的&#xff0c;一个合适的软件架构不仅结构清晰&#xff0c;并且便于开发。 我相信在嵌入式或单片机软件开发…

聚焦云原生安全|安全狗亮相云原生产业联盟年会

1月9日&#xff0c;云原生产业联盟年会成功举办。 作为国内云原生安全领导厂商&#xff0c;安全狗也受邀参与此次大会。 安全狗高级副总裁陈荣有发表寄语 在此次线上会议中&#xff0c;安全狗凭借突出的云原生安全整体实力&#xff0c;通过层层筛选与审核&#xff0c;入选成为…

OpenCV从3D-2D 点对应中查找对象姿势solvePnP

1.概述&#xff1a;在使用相机拍照片时&#xff0c;大多数人会考虑拍的好不好看&#xff0c;关注相机中物体坐标的并不多&#xff0c;但是对于地信学科来说&#xff0c;如果能从照片中获取物体的真实位置&#xff0c;对地理信息获取大有帮助&#xff0c;在这里面&#xff0c;十…

深入分析Linux PCI驱动框架(三)

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 先回顾一下PCIe的架构图&#xff1a; 本文将讲PCIe Host的驱动&#xff0c;对应为Root Complex部分&#xff0c;相当于PCI的Host Bridge部分&…

Vue 总结四 (ref, mixin, 插件, 插槽, VueX)

目录 ref 混入 mixin 插件 插槽 使用插槽的情景 使用方法 VueX 使用场景 使用 state 存放共享数据 actions 操作共享数据的API mutations 操作共享数据的API 生命周期图 ref 和id的区别 对于传统标签来说没有区别 都拿到的是 html内容 对于自定义的vue 的标签…

Spring事务源码分析

1. 前言 Spring支持两种事务管理的方式&#xff1a;声明式事务和编程式事务。编程式事务的优点是可以在代码里控制事务的粒度&#xff0c;实现细粒度的事务控制&#xff0c;缺点是对业务代码存在侵入性&#xff0c;代码复杂度较高&#xff0c;一般很少使用。声明式事务的优点是…

Linux下的动静态库

目录 认识动静态库 如何制作动静态库&#xff1f; 静态库 动态库 使用库 使用静态库 使用动态库 为什么动态链接是如此呢&#xff1f; 认识动静态库 我们在使用标准库的时候&#xff0c;需要有系统的头文件和系统的库文件&#xff0c;这个库文件是什么呢&#xff1f; …

Databend 借助对象存储帮你实现降本增效

本篇文章围绕着&#xff1a; 什么是对象存储当 Databend 遇到对象存储2022 年 Databend 利用对象存储降本的案例国内优秀的对象存储产品基于对象存储创业的产品 什么是对象存储 对象存储是一种可以非结构化存储和管理数据的技术。 可以简单理解为 NoSQL 接口方式存储和访问数…

linux系统中使用QT实现多媒体的功能方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用QT中的多媒体的功能。 目录 第一&#xff1a;多媒体基本简介 第二&#xff1a;应用实例实现 第三&#xff1a;程序运行效果 第一&#xff1a;多媒体基本简介 QT的多媒体模块提供了音频&#xff0c;视频&#xff…

分布式系统-CAP 理论

在前一篇分布式系统–拜占庭将军问题(The Byzantine Generals Problem) 我们理解了共识问题的背景&#xff0c;这一节主要讨论如何解决或者理解自己系统中的共识问题&#xff0c;通过什么来分辨自己的系统需要哪一种共识。 这个理论就是 CAP 理论&#xff0c;先想下面几个问题…

linux 线程详解

前言 程序运行在内存空间中叫进程&#xff0c;进程中包含有若干线程&#xff0c;线程是系统调度和执行的基本单位。线程才是程序运行的实体&#xff0c;通常程序里的main()函数就相当于主线程&#xff0c;把进程理解成一个容器&#xff0c;里面可以包含有若干线程和若干资源&am…

6)Mybatis启动流程

1. 首先Mybatis会加载配置文件mybatis-config.xml&#xff0c; 主要实现在Mybatis的builder模块&#xff0c;包路径org.apache.ibatis.builder&#xff0c;解析入口XMLConfigBuilder private void settingsElement(Properties props) {configuration.setAutoMappingBehavior(Au…

指针进阶篇(2)

进阶指针 &#x1f914;前言&#x1f914; 一、&#x1f60a;函数指针&#x1f60a; 二、&#x1f61c;函数指针数组&#x1f61c; 三 、&#x1f61d;指向函数指针数组的指针&#x1f61d; 四、&#x1f31d;回调函数&#x1f31d; &#x1f340;小结&#x1f340; &…

摩丝-题解

看到题目&#xff0c;怀疑是莫尔斯电码&#xff0c;打开发现果然是莫尔斯电码的点和划.. .-.. --- ...- . -.-- --- ..-简单说一下电报的原理最简单的电报模型就是一个电源&#xff0c;一个开关和一个电磁铁当需要长距离使用时候&#xff0c;需要用到继电器按下开关&#xff0c…

【BP靶场portswigger-服务端10】XML外部实体注入(XXE注入)-9个实验(全)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

C#【必备技能篇】使用NPOI实现对excel的读取和写入

文章目录1、Winform界面布局2、引用NPOI的dll3、源码4、运行效果5、NPOI的dll下载地址6、补充【以上步骤只能打开.xls文件&#xff08;97-2003版本&#xff09;&#xff0c;打不开.xlsx文件&#xff08;2007版本&#xff09;】1、Winform界面布局 2、引用NPOI的dll 3、源码 us…

(十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置

前言 本节内容我们主要介绍一下在jenkins中如何集成sonar qube代码质量检查工具&#xff0c;sonar qube可以在流水化项目集成部署前对我们的代码质量检查。开始本节内容前我们需要先搭建好sonar qube服务&#xff0c;关于sonar qube服务的搭建可参考作者往期博客内容&#xff…

P4391 [BOI2009]Radio Transmission 无线传输

题目描述 给你一个字符串 s_1s1​&#xff0c;它是由某个字符串 s_2s2​ 不断自我连接形成的。但是字符串 s_2s2​ 是不确定的&#xff0c;现在只想知道它的最短长度是多少。 输入格式 第一行一个整数 LL&#xff0c;表示给出字符串的长度。 第二行给出字符串 s_1s1​ 的一个子…

【linux入门】基础知识学习笔记

文章目录【第一章-宏观知识】1.硬件和软件的关系2.操作系统 是什么、作用是什么3.常见的操作系统4.Linux的诞生5.Linux内核 是什么6.Linux发行版 是什么7.WSL是什么8.虚拟机快照9.FinalShell&#xff08;Xshell替代品&#xff09;【第二章-Linux基础命令】1.Linux目录结构2.什么…