当前位置: 首页 > news >正文

索引的介绍

目录

1.索引的介绍

1.1 什么是索引

1.2 为什么要使用索引

2.索引应该选择哪种数据结构

 3.MYSQL中的页

3.1为什么要使用页

3.2页文件头和页文件尾 

 3.3 页主体

3.3页目录

 3.4数据页头

 4.B+在MYSQL索引中的应用

4.1计算三层树高的B+树可以存放多少条记录

5.索引分类

5.1 主键索引

5.2普通索引

5.3 唯一索引

5.4 全文索引

5.5 聚集索引

5.6 非聚集索引

5.7索引覆盖


1.索引的介绍

1.1 什么是索引

        MYSQL的索引是一种数据结构,它可以帮助数据库高效地查询、更新数据表中的数据。索引通过一定的规则排列数据表中的记录,使得表的查询可以通过对索引的搜索来加快速度。MYSQL索引类似于书籍的目录,通过指向数据行的位置,可以快速定位和访问表中的数据,比如汉语字典的目录页,我们可以按照笔画、偏旁部首、拼音等的目录(索引)快速查找需要的字。

1.2 为什么要使用索引

使用索引的目的只有一个,就是提升数据检索的效率,在应用程序的运行过程中,查询操作的频率远远高于增删该的评率

2.索引应该选择哪种数据结构

  • HASH

时间复杂度:O(1)

HASH是将存储的元素通过hash函数(存储位置 =  存储元素  % 容量 )找到存储位置使它们之间形成一种映射关系,查找的时候也是将查找的元素进行hash来查找元素,因此不支持范围查找。

最重要的数据结构没有之一,但是不支持范围查找

  • 二叉搜索树

时间复杂度 最好为:O(logN)最坏为一个单边树:O(N)

二叉搜索树的查找是先与根节点比较,再决定是往左还是往右查找。中序遍历是一个有序序列同时支持范围查找 ,但是可能会退化一个单边树使节点数过多让时间复杂度变为最坏情况

使得每次访问子节点都会发生一次磁盘 IO,磁盘IO是制约数据库性能的主要因素

  •  N叉树

时间复杂度为:O(logN)

N叉树每个节点可以有超过两个的子节点,可以解决树的高度问题。同时,在数据量相同的情况下,可以有效的控制树的高度,也就是说可以使用更少的IO次数找到目标节点,从而提高数据库的效率

N树的介绍

以上的数字称为度或阶,该数字表示每一个节点最多有多少个子节点,一般子节点的个数小于度的值,如果数字为四最多有三个节点

例如:度为3时先插入两个节点如图所示,接着插入40时变成第二副图

  •  B+树

B+数绍 

B+树是一种经常用于数据库和文件系统等场合的平衡查找树,MYSQL索引采用的数据结构,以4阶B+树为例,如图所示:

时间复杂度:O(logN)

优点:可以有效的控制树高

B+树与B树对比

1.  B+树叶子节点之间有一个相互连接的引用,可以通过一个叶子节点找到它相信的兄弟节点    

     MYSQL在组织叶子节点时使用的是双向链表

2.  B+树非叶子节点的值都包含在叶子节点中

     MYSQL非叶子节点只保存了对叶子节点的引用,没有保存真实的数据,所有真实的数据       都保存在叶子节点中

3.  对于B+树而言,在相同树高的情况下,查找任意元素的时间复杂度都一样,性能均衡

 3.MYSQL中的页

3.1为什么要使用页

在.ibd文件中最重要的结构体就是页,页是内存与磁盘交互的最小单位,默认大小为16KB,每次内存与磁盘的交互至少读取一页,所以在磁盘中每个页内部的地址都是连续的,之所以这样做,是因为使用数据的过程中,根据局部性原理,将来要使用的数据大概率与之前访问的数据在空间上是临近的,所以一次从磁盘中读取一页的数据放入内存中,下次查询的数据还在这个页中时就可以从内存中直接读取,从而减少磁盘IO提高性能

 16384(字节)/1024 = 16KB(1024个字节 = 1KB)

 

 

 MYSQL中有很多页类型,这里只讨论数据页或称为索引页

3.2页文件头和页文件尾 

页文件头和页文件尾中包含的信息,如下图所示:当前页文件的主要信息,这里我们只关注上一页页号和下一页页号,通过这两个属性可以把页与页之间连接起来,形成一个双向链表。

 3.3 页主体

页主体部分是保存真实数据的主要区域,每当创建一个新页,都会自动分配两个行,一个是页内最小行Infimun,另一个是页内最大行Supremun,这两个行并不储存任何真实信息,而是做为数据行链表的头和尾,第一个数据行有一个记录下一行的地址偏移量的区域next_record将页内所有数据行组成一个单向链表,此时新页的结构如下所示:

 当向一个新页插入数据时,将Infimun连接第一个数据行,最后一行真实数据行连接连接Supremun,这样数据行就构成了一个单向链表,更多的行数据插入以后,会按照主键从小到大的顺序进行连接,如上图所示。

3.3页目录

 3.4数据页头

数据页头记录了当前页保存数据相关的信息,如下图所示

 4.B+在MYSQL索引中的应用

非叶子节点保存索引数据,叶子节点保存真实数据,如下图所示

4.1计算三层树高的B+树可以存放多少条记录

理论上:

一个数据页默认16KB,假设一条数据1KB,一页中至多可以存16条数据

  • 假设⼀条⽤⼾数据⼤⼩为1KB,在忽略数据⻚中数据⻚⾃⾝属性空间占⽤的情况下,⼀⻚可以存16 条数据
  • 索引⻚⼀条数据的⼤⼩为,主键⽤BIGINT类型占8Byte,下⼀⻚地址6Byte,⼀共是14Byte,⼀个 索引⻚可以保存 16*1024/14 = 1170 条索引记录
  • 如果只有三层树⾼的情况,综合只保存索引的根节点和⼆级节点的索引⻚以及保存真实数据的数据 ⻚,那么⼀共可以保存 1170*1170*16 = 21,902,400 条记录,也就是说在两千多万条数据的 表中,可以通过三次IO就完成数据的检索

5.索引分类

5.1 主键索引

  1. 当在一个表上定义一个主键PRIMARY KEY时(自动创建索引,索引的值是主键列的值),InnoDB使用它作为聚集索引。
  2. 推荐为每个表定义的一个主键。如果没有逻辑上唯一且非空的列或列集可以使用主键,则添加一个自增例。

5.2普通索引

  1. 最基本的索引类型,没有唯一性的限制。
  2. 可能为多列创建组合索引,称为复合索引或组全索引(创建索引之后会生成一颗索引树,创建多少索引生成多少棵索引树)

为了提升查询效率。工作中通常为查询频繁的列创建索引,列的重复度不高可以包含一个列也可以包含多个列

5.3 唯一索引

  1. 当在一个表上定义一个唯一键UNQUE时,自动创建唯一索引。
  2. 与普通索引类似,但区别在于唯一索引的列不允许有重复值。

5.4 全文索引

  1. 基于文本列(CHAR、VARCHAR 或 TEXT列)上创建,以加快对这些列中包含的数据查询和DML操作
  2. 用于全文搜索,仅MylSAM和InnoDB引擎支持

5.5 聚集索引

  1. 与主键索引是同义词
  2. 如果没有为表定义PRIMARY KEY,InnoDB使用第一个UNIOUE和NOT NULL的列作为聚集索引
  3. 如果表中没有PRIMARY KEY 或者合适的 UNIOUE 索引,InnoDB会为新插入的行生成一个行号并用6字节的ROW_ID(数据行中的一个隐藏列之一)单调递增,并使用ROW_ID做为索引。

5.6 非聚集索引

  1. 聚集索引以外的索引称为非聚集索引或者二级索引
  2. 二级索引中的每条记录都包含该行的主键列,以及二级索引指定的列
  3. InnoDB使用这个主键值来搜索聚集索引中的行,这个过程称为回表查询

5.7索引覆盖

当一个select语句使用普通索引且查询列表的列刚好是创建普通索引时的所有或部分列,这时就可以直接返回数据,而不是用回表查询,这样的现象称为索引覆盖

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网页打开时,下载的文件text/html/重定向类型有什么作用?
  • C# 开发教程-中级教程
  • 【Python】耗时任务的超时管理
  • Python 的集合类型
  • 计算机三级网络技术总结(四)
  • Python 从入门到实战22(类的定义、使用)
  • TCP/IP五层模型
  • HBase初探笔记
  • 【前端】main.js中app.vue中 render函数的作用及使用背景
  • 黑马头条day2-预览
  • MME-RealWorld:您的多模态大型语言模型能挑战高分辨率的真实世界场景吗?这些场景对人类来说都非常困难!
  • 自动化测试Mock神器:轻松模拟HTTP请求!
  • 【深度学习】(2)--PyTorch框架认识
  • 简单题66-加一(Python)20240918
  • GUI编程16:图片按钮、单选框、多选框
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • HomeBrew常规使用教程
  • in typeof instanceof ===这些运算符有什么作用
  • input实现文字超出省略号功能
  • JavaWeb(学习笔记二)
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • springboot_database项目介绍
  • ucore操作系统实验笔记 - 重新理解中断
  • vue--为什么data属性必须是一个函数
  • 闭包,sync使用细节
  • 猴子数据域名防封接口降低小说被封的风险
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 深度解析利用ES6进行Promise封装总结
  • 我的业余项目总结
  • 详解移动APP与web APP的区别
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 《码出高效》学习笔记与书中错误记录
  • # Panda3d 碰撞检测系统介绍
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #define、const、typedef的差别
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (十一)图像的罗伯特梯度锐化
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)Unity3DUnity3D在android下调试
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • *** 2003
  • ***监测系统的构建(chkrootkit )
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net 生成二级域名
  • .NET技术成长路线架构图
  • .NET使用存储过程实现对数据库的增删改查