【MySQL】索引

索引

  • 概念
  • 作用
  • 优势和劣势
  • 具体操作方式
    • 创建索引
      • 自动
      • 手动创建
    • 查看索引
    • 删除索引
  • 索引的数据结构
    • 哈希表
    • 二叉搜索树
    • 平衡二叉树
    • B树
    • B+ 树

概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现

作用

  1. 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  2. 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  3. 索引对于提高数据库的性能有很大的帮助

优势和劣势

优势 : 提高查询的速度
劣势: 占据额外的硬盘空间,可能会拖慢插入删除修改的速度

具体操作方式

创建索引

自动

在创建表时给字段加主键 外键``unique约束时回自动创建索引

  1. 主键约束 : 主键约束要求数据非null且不重复 我们每插入一个数据时 数据库都要进行一次查询看是否有重复的元素 因此数据库会为我们自动创建索引来加快这种查询速度
  2. 外键约束: 在向从表中插入数据时,会在主表中查询是否有从表中约束的值,此时数据库会进行一次查询操作 因此数据库会为我们自动创建索引来加快这种查询速度
  3. unique约束: unique约束后要求数据不可以重复 因此每插入一次数据都会进行一次查询 看是否有重复的元素 因此数据库会为我们自动创建索引来加快这种查询速度

手动创建

create index 索引名 on 表名(列名)

查看索引

show index from 表名

删除索引

drop index 索引名 on 表名

删除索引只能删除我们手动创建的索引 数据库为我们自动生成的索引无法删除

如果对数据量很大的数据库进行插入/删除索引的操作时 可能会把数据库卡死

索引的数据结构

我们针对innodb这个存储引擎来讨论MySQL索引的数据结构

哈希表

我们在学习数据结构时 哈希表是一种非常强大的数据结构
它可以在o(1)的时间复杂度完成查找操作

但是根据哈希表的存储结构来看 他存储的数据都是分散分布在表中
如果我们只针对于查询特定的一个元素 那么哈希表无疑非常适合
但是如果我们要查找一个范围内的数据 比如说查找 小于15岁的学生 这时我们就无法快速的查找到该范围内的所有数据 因此哈希表并不适合我们索引

二叉搜索树

在这里插入图片描述
二叉搜索树的特点是每个节点的左树都比自身小 右节点都比自身大
但是二叉搜索树非常考验插入数据的顺序

在这里插入图片描述

例如 我们的数据是按照从大到小的顺序插入 此时树结构就不会出现 反之出现的是一种类似于链结构的数据结构 这样并没有优化硬盘的I/O次数 所以不用考虑

平衡二叉树

平衡二叉树在二叉搜索树的基础上 解决了我们因为插入元素顺序造成的伪树结构 使树的左右两个树的层级最多相差一 保证二叉树平衡

平衡二叉树的查找性能接近于二分查找 暑假复杂度为O(log2n)

但是又会出现问题

  1. 当数据量大的时候 树的高度就会增加 而树的高度对应着每条数据查找时和硬盘的I/O次数 因此在数据量大时 查询效率会大幅降低
  2. 和哈希表一样 平衡二叉树也不支持范围的快速查找 ,范围查找需要多次遍历二叉树 效率很低

B树

根据二叉树的缺陷 数据量越大 树的高度越高 那么我们有没有一种方式来降低树的高度呢?
这时就可以采用B树

B树有以下的特点:

  1. 每个结点的值(索引) 都是按递增次序排列存放的,并遵循左小右大原则。

  2. 根结点 的 子节点 个数为 [2,M]。

  3. 除 根结点 以外 的 非叶子结点 的子节点个数 为[ Math.ceil(M/2),M]。 Math.ceil() 为向上取整。

  4. 每个 非叶子结点 的值(索引) 个数 = 子节点个数 -1 。最小为 Math.ceil(M/2)-1 最大为 M-1 个。

  5. B树的所有叶子结点都位于同一层。

在这里插入图片描述
每个节点都可以存放多个数据 此时树的高度就会大大降低 查找效率就会变高

缺陷

B树虽然降低了树的高度 使磁盘I/O数量降低 但是B树还是没有解决范围查找的缺陷 如果要查询一个范围内的数据,每次查找还需要从根节点遍历树

B+ 树

在B树的基础上 又提出了B+树
B+树在B树的基础上 解决了范围查询的问题
在这里插入图片描述

如图所示 B+树有以下特点

  1. 只有叶子节点储存数据 其他节点只保存索引
  2. 叶子节点包含整棵树的所有元素
  3. 叶子节点会被连接成双向链表

这样的话不仅继承了B树降低树的高度的优点 还能够进行范围查询

例如我们要查询年龄在18岁到25岁之间的数据,我们只需要找到18岁的数据 再找到25岁的数据 根据叶子节点的双向链表就能找到18到25岁之间的所有数据

因此数据库索引就采用了B+树

优点

  1. 擅长范围查询
  2. 所有的查询都落在叶子节点上 比较次数是均衡的 查询时间是稳定的
  3. 叶子节点上储存了所有数据 其他节点就可以只保存索引

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中移链与BSN分布式云管平台集成,共同构建专属协同体系

01 中移链与BSN分布式云管平台集成, 融入BSN生态体系 中移链OPB(OPB即开放联盟链,Open Permissioned Blockchain)与BSN基于BSN分布式云管平台,打造了中移链专属门户、中移链专属运营、中移链专属运维功能模块&#x…

WebRTC带宽评估 -- Transport-wide Congestion Control

简述:在RTP包中增加transport-wide-cc扩展头,放置传输层面的包序号。视频接收端记录RTP包的接收时间,并通过RTCP Feedback消息反馈到视频发送端,发送端结合缓存的RTP包发送时间,基于丢包和延迟估算当前带宽&#xff0c…

【数据架构】Data Fabric 架构是实现数据管理和集成现代化的关键

D&A 领导者应该了解数据编织架构的关键支柱,以实现机器支持的数据集成。 在日益多样化、分布式和复杂的环境中,数据管理敏捷性已成为组织的任务关键优先事项。为了减少人为错误和总体成本,数据和分析 (D&A) 领导者需要超越传统的数据…

(三)springboot实战——web新特性之函数式实现

前言 本节内容我们主要介绍一下web访问的另一种形式,通过函数式web实现一个restful风格的http请求案例。函数式web是spring5.2之后的一个新特性,可以通过函数去定义web请求的处理流程,使得代码更为简洁,耦合性也降低了。 正文 …

数据结构day7(2023.7.23)

一、Xmind整理: 二、课上练习: 练习1:结点之间的关系 练习2:二叉树的特殊形态 练习3:满二叉树的形态 练习4:完全二叉树的形态 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树 练习5&am…

Window下编译ffmpeg

Window下编译ffmpeg 下载MSYS2编译ffmpeg运行 下载MSYS2 MSYS2是一个是工具和库的集合,它能够方便的在windows上编译、安装和运行程序。ffmpeg可以通过这个软件来编译。 从MSYS2官网下载MSYS2并安装。 运行MSYS2终端,在终端中输入命令,安装…

07统计模型练习

使用SPSS进行分析求解 第一题 下表1.1是中国1994-2016年国内旅游总花费Y、国内生产总值X1、铁路里程X2和公路里程X3的数据,请据此分析如下问题: (1)就建立简单线性回归模型,分别分析中国国内旅游总花费与国内生产总值、铁路里程和公路里程数据的数量关系。 (2)对建立的回归模型…

JVS开源基础框架:用户管理介绍(支持同步钉钉、企微、微信等)

在企业内部系统中,用户管理是指对系统内的用户进行管理、授权和权限管理的过程,这里主要介绍用户的创建与基本信息的管理,权限、登录等详细介绍请参考相关章节。 用户管理界面 点击平台管理-用户管理,界面上展示了组织管理与组织…

potplayer放大画面,画面拖拽。备份

放大画面: 按住alt和鼠标左键,就可以拖动放大后的画面了 窗口化示图 倍数调整 默认只能0.1往上加,但是有的视频0.08倍数才正好,需要精确到2位小数。

基于Vue+Element Plus实现表格组件

目录 前言分析实现例子效果图前言 表格对于管理类项目是很重要的,可以只管的展示和比比较数据。使用Element Plus能解决一部分问题,但是还存在一些缺点和不足。 分析 浏览器上表格数据展示空间不足。列显示太多不够直观。完全依赖官方表格组件代码过于臃肿不利于管理和优化…

【Docker】Docker基本管理命令

目录 一、Docker概述1.1容器化受欢迎的原因1.2Docker核心概念 二、安装 Docker2.1环境准备 三、Doker镜像操作镜像操作选项 四 、Docker 容器操作容器操作选项 一、Docker概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是…

vue项目之《 搭建路由系统 》

author:德玛玩前端 date:2023-07-22 今天,在工作中拿到了架构师的前端框架,是一个vue2elementui搭建的单页面架构,没有路由系统,需要自己搭建,因为以往拿到的框架都是路由系统已经搭建好&#x…

【Linux】Tcp服务器的三种与客户端通信方法及守护进程化

全是干货~ 文章目录 前言一、多进程版二、多线程版三、线程池版四、Tcp服务器日志的改进五、将Tcp服务器守护进程化总结 前言 在上一篇文章中,我们实现了Tcp服务器,但是为了演示多进程和多线程的效果,我们将服务器与客户通通信写成了一下死循…

iphone新机官网验机流程

苹果官网验机流程 进入苹果官网,找到技术支持,进入“查看保障服务和支持期限“页面,输入要查询的机器的序列号,就可以查询了。 苹果官网验机入口:https://checkcoverage.apple.com/ 输入iphone序列号进行验机&#xff…

【高阶数据结构】B树

文章目录 一、B-树1. 常见的搜索结构2. B树概念3. B-树的查找4. B-树的插入分析 二、B树和B*树1. B树2. B*树 三、B-树的应用1. 索引2. MySQL索引简介2.1 MyISAM2.2 InnoDB 一、B-树 1. 常见的搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log2N)二叉搜索…

【LeetCode热题100】打卡第42天:滑动窗口最大值搜索二维矩阵II

文章目录 【LeetCode热题100】打卡第42天:滑动窗口最大值&搜索二维矩阵II⛅前言 滑动窗口最大值🔒题目🔑题解 搜索二维矩阵II🔒题目🔑题解 【LeetCode热题100】打卡第42天:滑动窗口最大值&搜索二维…

帖子列表和SerializerMixin注意事项

帖子序列化 继承SerializerMixin 即可调用to_dict()序列化 后端 class PostModel(db.Model, SerializerMixin):serialize_only ("id", "title", "content", "create_time", "board", "author")__tablename__ …

rabbitmq访问异常

看到这个问题,第一时间想到rabbitmq的问题,应该权限导致的 先创建virtual hosts 接着创建用户并赋予权限,将eayc的virtual hosts权限赋予acc用户即可 15:34:24.250 WARN com.rabbitmq.client.impl.ForgivingExceptionHandler - An unexpected connec…

线程的基本概念

线程的基本概念 1. 概念1.1 什么是线程1.2 为什么要有线程1.3 进程和线程的区别 2. 线程创建的基本方法3. Thread 类3.1. Thread 的常见构造方法3.2 Thread 类常见的几种方法 4. 线程的状态 1. 概念 1.1 什么是线程 一个线程就是一个 “执行流”. 每个线程之间都可以按照顺讯…

Vue中TodoList案例_添加

与上一篇Vue中TodoList案例_初始化列表有四个文件变化了 安装nanoid库&#xff1a; npm i nanoid App.vue <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHeader :addTodo"…