MySQL数据库(八)

news2024/12/23 4:33:51

目录

一、什么是索引

1.1索引的原理

1.2索引的优缺点

二、索引的使用

2.1查看索引

2.2手动创建索引

2.3删除索引

三、MySQL索引底层的数据结构

3.1 B树

3.2 B+树


一、什么是索引

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

通俗来说,索引就是一本字典的的查询目录,用以加快查询的速度

1.1索引的原理

数据库的索引是以列为维度建立的,由于数据库有很多列,所以索引也可以有很多

  • 索引是存储在数据库服务器的硬盘上, 具体来说, 是存储在硬盘上的文件中的.

因为数据库中存储的数据量很大, 所以我们才会想去建立索引, 以便于在查询的时候快速锁定指定数据. 而基于这些庞大的数据量建立起来的索引本身也很大, 而且一般还会建立多个不同的索引.所以, 索引不可能全部存储在内存中.

  • 索引采取的是空间换取时间
  • 没有建立索引就是默认的全文检索

1.2索引的优缺点

缺点:

  • 需要额外的数据库硬盘空间
  • 有可能拖慢数据库 增删改 的速度. 进行 增删改 的时候, 不仅是要改变数据库中的数据, 还要更改维护索引文件.(但是日常的工作中增删改是比较少的)
  • 维护索引需要消耗数据库资源.

优点:

  • 大大提高数据查询速度.
  • 减少硬盘IO次数

二、索引的使用

2.1查看索引

show index from tb_name; --tb_name是自定义的表名

  • 首先创建一个基本表,在查看具体的索引,这里是没有索引的

  •  删除当前的表再次进行创建,这一次添加主键约束,发现数据库会自动创建一个名PRIMARY的索引(原因是主键不允许重复,因此进行插入或者修改就需要先查询,这个过程相对复杂所以就会自动创建一个索引来加快查询)

  •  再次删除,这一次添加unique的约束条,同样的也会自动创建一个索引,这里的索引命名就是以列名命名的

  •  再次删除表,这一次添加主键约束以及外键约束,这里发现建立外键约束也会自动创建索引,并且索引是不唯一的。

通过上述示例,MySQL数据库中关于主键约束、unique约束、外键约束是会自动生成索引的 

2.2手动创建索引

create index 索引名 on 表名(字段名);

手动创建索引是存在一定的风险的,因为在创建索引的过程中数据库是不可用的,而且当数据量很大的时候,索引的创建也可能会失败甚至会导致数据库卡死。所以正确的索引创建是在建表之的时候

当确实需要在大量数据的基础之上去创建索引,这里的方法是将表中的数据进行备份,准备好一个新的mysql服务器,然后创建好新的表以及索引,最后将需要替换的mysql的服务器关闭,最后将新的mysql服务器替换上去就行了。

2.3删除索引

drop index 索引名 on 表名;

在删除索引的时候也需要主要当有外键约束的主表时,先要将外键约束的表进行删除,这与删除表的道理是一样的,子表对父表也有一个约束作用。

三、MySQL索引底层的数据结构

为了了解清楚MySQL底层的数据结构,取决于MySQL使用哪个存储引擎,当前主流的的储存引擎是Innodb并且这里的数据结构是在硬盘上的。接下将以Innodb来展开

索引是为了进行快速的查找,所以在数据结构的选取的时候不免就会想到哈希表二叉搜索树,但是在数据库中是有模糊查询与范围查询的,哈希表、二叉搜索树这些数据只能进行精确的查询所以这两个数据结构是无法实现的,进而又想到了红黑树,但是红黑树的时间复杂度O(logn)当树的深度越深的时候查询效率越慢,虽然这个在内存中没有很大的影响,但是数据库中的数据结构是放在硬盘上的,这样会导致查询效率大大降低!所以这里就有了数据库的数据结构:B树以及B+树

3.1 B树

B树的核心思路和“二叉搜索树”是差不多的,但是为了降低树的高度,B树采取的是N叉树,这样就大大降低了树的高度以及节点数。为什么要去降低树的高度?

因为MySQL的数据是存储在硬盘文件中的,查询处理数据时,需要先把硬盘中的数据加载到内存中,硬盘IO操作非常耗时,所以节点越多、树的高度越高,硬盘的IO操作就越多。这样的查询效率就会大大降低。

B树的主要特点有:

  • B树的节点中存储着多个元素, 每个内节点有多个分叉.
  • 在所有的节点中都存储数据
  • 父节点当中的元素不会出现在子节点中.
  • 所有的叶子节点都位于同一层, 叶子节点具有相同的深度, 叶子节点之间没有指针连接.

B树结构大致如下:

在这里插入图片描述

虽然B树已经很理想了, 但是还有可以优化的地方:

  • B树不支持范围查询的快速查找. 例如: 仍然根据上图, 我们想要查询10到35之间的数据, 查找到10之后, 需要回到根节点重新遍历查找, 需要从根节点进行多次遍历, 查询效率有待提高.
  • B树的复杂度很不稳定. 与 key 在树中的位置有关, 最好的时间复杂度为O(1)

由于B树存在一定的不足,数据库中就引入了B+树

3.2 B+树

B+树是B树的改造版, 他与B树的不同点有:

  • 叶子节点存储的是数据的全集, 其他节点不再存储data, 只存储key
  • 叶子节点之间使用双向指针连接, 最底层的叶子节点形成了一个双向有序链表, 方便进行范围查询.

B+树的大致结构:

在这里插入图片描述

由于B+树将所有的索引项都放在了叶子节点上, 所以每次查询数据的时候, 都需要检索到叶子节点, 那么每次检索的硬盘IO次数与树的高度产生了直接的关系, 并且查询的时间复杂度更为稳定.

但是由于非叶节点不再存放data,一次硬盘IO操作能够读取更多的key, 能索引的范围更大更精确, 所以相对于B树来说, B+树的树高理论情况下是比B树要矮的, 进而可以减少相应的硬盘IO操作.

MySQL数据库中innodb搜索引擎使用的就是B+树

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

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

相关文章

深度理解 Spring AOP

一、什么是AOP(面向切面编程)?🍉 AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式 和运行期 动态代理 实现程序功能的统一维护的一种技术。 AOP (面向切面编程)是 OOP&a…

Jmeter 接口自动化和 Python 接口自动化,到底选哪个?

目录 前言: 背景 Jmeter 接口自动化 特点 Python 接口自动化 特点 谈项目 写在最后 前言: JMeter接口自动化和Python接口自动化都是常见的选择。 背景 很多刚接触接口自动化的朋友都会疑惑,市面上 Jmeter 接口自动化,Py…

题目2 文件上传(保姆级教程)

url:http://192.168.154.253:82/ #打开http://XXX:81/,XXX为靶机的ip地址 审题 1、打开题目看到有一个提示,此题目需要绕过WAF过滤规则,上传木马获取webshell,最后从根目录下key.php文件中获得flag 2、开始答题 第一步…

【数据结构】二叉树详解(3)

⭐️ 前言 ✨ 往期链接:【数据结构】二叉树详解(1) 在第一篇二叉树文章中,我们探讨了二叉树的链式结构定义与实现。二叉的遍历包含( 前序/中序/后序遍历 )及代码实现和递归流程图的详细讲解。还有一些二叉树的其他接口定义与实现,包含 Binar…

基于netlify生成custom SSL certificate

(1)腾讯云申请 (2)域名控制台解析 (3)Nginx下载(crt: CA certificate Chain)

C++ 设计模式 ---- 接口隔离模式

“接口隔离”模式 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。典型模式:1、Facade2、Proxy3、…

MongoDB原生语句更新嵌套数组的值

一、更新一层嵌套数组 首先执行MongoDB原生语句脚本在user集合中产生一些样本数据,如下所示: db.user.insert({"_id":1,"title":"爱情公寓3","students":[{"student_id":1001,"student_name":"林宛瑜&quo…

Docker介绍及安装使用

Docker介绍及安装使用 一、Docker的概述1、Docker是什么?2、Docker的Logo3、Docker的设计宗旨(一次封装,到处运行)4、容器化越来越受欢迎的原因 二、Docker与虚拟机的区别三、Docker的使用场景四、Docker的核心概念1、镜像2、容器…

基于linux下的高并发服务器开发(第二章)- 2.25 sigprocmask 函数使用

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);- 功能:将自定义信号集中的数据设置到内核中(设置阻塞,解除阻塞,替换)- 参数:- how : 如何对内核阻塞信号集进行处理SIG_BLOCK: 将用户设…

【MySQl】MySQl中的乐观锁是怎么实现的

文章目录 前言一、乐观锁二、如何实现乐观锁呢,一般来说有以下2种方式2.1、使用数据版本(Version)记录机制实现2.2、乐观锁定的第二种实现方式和第一种差不多 前言 mysql中的乐观锁是怎么实现的?很多新手对此不是很清楚&#xff…

第一次参加【CSDN周赛(考试/编程竞赛)】第65期,应该注意些什么?都考什么题目?要具备什么知识?耗时__,我居然取得了__分的成绩

订阅专栏,学习更多干货知识!! 第一次参加 CSDN里的竞赛(考试),都需要注意些什么?考试都考了什么?要具备什么知识?本文带你了解一下!! 🤾🏿‍♂️目录 🌁一、先来看结果吧(有Bug?)🥕1.1 什么情况!🥕1.2 测评报告🥤1.2.1 选择题🥤1.2.2 编程题🥕1…

Redis持久化:分别启用rdb和aof,并查看是否有对应文件生成

一、rdb 简介:在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是Snapshot快照,它恢复时是将快照文件直接读到内存里。 1. 进入redis.conf文件中查看配置文件 [rootserver ~]# vim /usr/local/redis-stable/redis.conf 2.把持久化的…

《Docker数据管理:卷、挂载和持久化,保障容器环境数据安全》

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

【博客682】k8s apiserver bookmarks机制以更高效检测变更

k8s apiserver bookmarks机制以更高效检测变更 list-watch背景: List-Watch 是kubernetes中server和client通信的最核心的机制, 比如说api-server监听etcd, kubelet监听api-server, scheduler监听api-server等等,其实…

Paragon NTFS2023最新版Mac读写NTFS磁盘工具

Paragon NTFS for Mac是Mac平台上一款非常优秀的读写工具,可以在Mac OS X中完全读写、修改、访问NTFS硬盘、U盘等外接设备的文件。这款软件最大的亮点简书可以让我们读写 NTFS 分区,因为在Mac OS X 系统上,默认状态下我们只能读取NTFS 分区&a…

152. 乘积最大子数组

152. 乘积最大子数组 原题链接:完成情况:解题思路:参考代码: 原题链接: 152. 乘积最大子数组 https://leetcode.cn/problems/maximum-product-subarray/ 完成情况: 解题思路: 看好题目&…

Nginx 301重定向分析

参考; 404 - 墨天轮 深度硬核文:Nginx的301重定向处理过程分析 - 知乎 Nginx的301状态码处理逻辑设计 HTTP协议中3xx开头的状态响应码都是表示重定向的响应。根据RFC的定义: 301 Moved Permanently 302 Found 303 See Other 307 Temporary Redirect 301是永…

STL——String类(2)成员函数详解

目录 前言 一.String的成员函数: 1.基本成员函数 代码实验: 实验结果: 类对象每次扩容后的capacity数据展示: 1.2. resize():调整字符串大小 1.3reserve():请求更改该对象的容量capacity值 代码实验…

分组密码模式的填充

分组加密 在密码学中,分组加密(Block cipher),又称分块加密或块密码,是一种对称密钥算法。 它将明文分成多个等长的模块(block),使用确定的算法和对称密钥对每组分别加密解密。 常见的分组加密算法有: DES、3DES、AES、IDEA。 …

Ubuntu虚拟机部署配置

目录 虚拟机镜像下载 VirtualBox7下载 VirtualBox7安装镜像流程 创建虚拟机 虚拟机挂单独硬盘 网络设置 检查虚拟机配置 启动虚拟机 ubuntu配置 查询虚拟机IP地址 修改ROOT密码 更新apt NTP同步 挂载磁盘&关闭swap 虚拟机镜像下载 目前国内操作系统镜像源非常…