【数据库基础-mysql详解之索引的魅力(N叉树)】

在这里插入图片描述

索引的魅力目录

  • 🌈索引的概念
  • 🌈使用场景
  • 🌈索引的使用
    • 🌞🌞🌞查看MySQL中的默认索引
    • 🌞🌞🌞创建索引
    • 🌞🌞🌞删除索引
  • 站在索引背后的那个男人~
    • 🌞🌞🌞为什么不用哈希表
    • 🌞🌞🌞为什么不用二叉搜索树
  • 🌈B+ 树
  • 🌈B树
  • 🌈B+ 树
    • 🌞🌞🌞B+树的一些优点:
  • 🌈数据库的经典面试题

🌈 个人主页: 努力学编程’
个人推荐: 基于java提供的ArrayList实现的扑克牌游戏 | C贪吃蛇详解
学好数据结构,刷题刻不容缓: 点击一起刷题
🌙 心灵鸡汤总有人要赢,为什么不能是我呢
在这里插入图片描述
hello,友友们今天给大家来讲一下,数据库中的一个非常重要的知识索引,这不仅可以提高我们查找数据的效率,也可以然我们对于数据库有更加深刻的认识。

🌈索引的概念

索引的概念其实非常简单,这里可以类比书的目录进行对比,索引对于数据库来说其实就是一个目录,通过索引我们可以对数据进行快速的查找大大提高了我们操作数据库的成本。
在这里插入图片描述

🌈使用场景

通常我们使用索引,是基于数据量非常大的时候,且对于数据的修改操作执行比较少的时候,如果你的数据库是以下几种情况你就得认真思考一下啦:

  • 数据库的数据量非常少,因为创建索引也要一定的的内存消耗,如果数据量少那就没必要创建索引了。
  • 数据库的数据需要大量的修改操作,此时创建索引也是不划算的,大量的修改会提高你的维护成本,就好比你写了一本书,完成初稿后,你还要对内容进行大量的修改,如果你创建了目录,那目录岂不是也要大量的修改!!!
  • 当然创建索引的时候,会占用一定的磁盘空间,要谨慎使用!!!

🌈索引的使用

在MySQL中有些约束条件会主动提供给我们一些索引,例如:unique,primary key ,foreign key 都会默认生成一个索引。

🌞🌞🌞查看MySQL中的默认索引

== show index from 表名;==
在这里插入图片描述

🌞🌞🌞创建索引

当然我们可以根据自己需要创建索引,这里要给大家提醒一下,其实创建索引也是一个很危险的操作如果是一个空表,当然没有什么风险,但是如果你的数据是几千几万那么当你创建索引的时候,就会触发大量的硬盘IO,可能会把硬盘吃满,机器直接崩溃~~
create index 索引名 on 表名(字段名);
在这里插入图片描述

🌞🌞🌞删除索引

drop index 索引名 on 表名;

站在索引背后的那个男人~

所谓索引,其实就是对数据进行一定的整理,在我们查询数据的时候会大大提高效率,而这背后实际上用到的还是我们之前提到过的数据结构,那么那个数据结构可以对提升查找数据的效率呢,其实就两个,哈希表和搜索二叉树。
在这里插入图片描述

🌞🌞🌞为什么不用哈希表

在哈希表中我们只能判断是否相等的情况,对于范围的查询,以及类似于like的模糊查询,其实我们是做不到的~~

🌞🌞🌞为什么不用二叉搜索树

当我们处理的数据非常大的时候,创建一个二叉搜索树必然会使这棵树的高度非常高,树的高度一旦非常高,那么查找起来其实是非常低效的,所以这里也不选择二叉搜索树~~

🌈B+ 树

那么不用哈希表,也不用二叉搜索树,我们应该用什么数据结构去处理这个问题呢,其实这里专门为了数据库创建了一个数据结构-B树:

🌈B树

B树,又称N叉搜索树,相信这个名字,可以让你对于B树的理解,有一个比较清晰的认识,对比二叉搜索树,B树每个结点有N个度,而且每个节点也并非只有一个值,一般会有多个,通过这两个结构上的改变,就可以有效的降低树的高度,从而提升树的高度。
在这里插入图片描述
但是我们发现B树其实还是有很多需要改进的地方的,比如虽然我们降低了树的高度,但是我们提高了树的每个节点的值的数量,这就意味着如果我们要插入一个数据,可能就需要多个数据的比较,好像并没有对二叉搜索树做出很大的优化啊,其实还是优化了不少的,虽然增加了每个节点的值的数量,但是,针对每一个节点,只会发生一次硬盘IO,所以虽然每个节点的值变多了,但是对比与二叉搜索树,大大减少了硬盘IO的次数,这才是我们优化的最重要的方面!!!

🌈B+ 树

针对B树我们做了一定的优化,又有了另一种数据结构-B+树,他的主要特点对比B树就是每个节点的度是N个,并且每个节点的值都会在子节点以最大值的形式出现,直到最后一行,会把整个数据库中的数据做一个整理,以链表的形式将他们连接起来,便于查找!!!
在这里插入图片描述

🌞🌞🌞B+树的一些优点:

  • N叉搜索树,高度较低,硬盘IO的次数较少。
  • 叶子结点是全集,并且用链表连接,便于查询。
  • B+树每一次的查询,都是要落在叶子结点上的,所以每次的IO次数以及比较次数其实是差不多的,所以查询的开销是比较稳定的!!!
  • 由于B+树的叶子结点是全集,所以非叶子结点不必存储数据行,只需要存储索引列的key即可,使得非子节点所消耗的空间变少,进一步较少硬盘IO的次数

🌈数据库的经典面试题

  • 索引是啥,解决了什么问题
  • 答:索引相当于书的目录,用来提升查询的效率

  • 索引付出了什么代价
  • 答:付出了更多的空间,有可能会影响增删找的效率,比如你的数据库需要大量修改的时候。但是我们认为创建索引总体来说是利大于弊的,我们支持创建索引。

  • 如何使用sql命令,是否有注意事项
  • 答:show index from 表名 (查看索引)-主键,外键,unique会自定生成目录~~,create index 索引名on 表名(指定列),删除索引 drop index 索引名 on 表名;,而且在我们创建了索引之后,在查询的时候,必须要和索引的列相匹配,否则不会提高查找数据的效率,类似于字典不同的目录,就有不同的查找方式!!!

  • 索引背后的数据结构->B+树,及其优点和特点
  • 特点即优点: N叉搜索树,每个节点有N个值,划分为N个区间,高度比较低,降低了硬盘IO的次数,范围查询非常方便,所有的节点都落到了叶子结点上,开销非常稳定,容易预估成本。叶子结点存储行的数据,非叶子节点只存储索引的key的值,非叶子节点占据空间小,可以加载到内存中,减少IO的次数,每个父节点都会下沉到子节点中,作为最大值的角色出现,叶子节点这一层构成了数据的全集,使用类似于链表的数据结构将叶子节点串起来~~

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

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

相关文章

Java时间类--JDK7

一、Date类 1.引言 全世界的时间,有一个统计的计算标准。 1884年,将英国格林威治时间认为是世界标准时间。 在2012年1月份后,由于误差太大,最高可达16min。 取消使用了近130年的格林威治时间,改用原子钟作为世界标…

Mistral AI 团队发布 Mistral-7B-Instruct-v0.3

抱抱脸上线了 Mistral-7B-v0.3 的基础版和指令微调版。 相比于Mistral-7B-v0.2,新版本更新如下: – 词汇量从 32000 扩展到 32768 – 支持 v3 分词器 – 支持函数调用 Mistral-7B-v0.3:网页链接 Mistral-7B-Instruct-v0.3:网页…

vue项目打包教程

如果是用 vue-cli 创建的项目,则项目目录中没有 config 文件夹,所以我们需要自建一个配置文件;在vue项目目录下创建文件 vue.config.js,需注意文件名称必须是 vue.config.js,然后在文件中插入以下代码: 文件…

Wireshark 搜不到字符串?

一个原因是pcap里没有这个字符串, 另一个原因可能是ctrlF之后,选择搜索的地方不对,或者是编码方式选择的不对。 上面图片的第一个下拉框是要搜索的一个范围,是在哪一个panel搜索,范围说明在下面这个链接有详细说明&…

数据结构:树(3)【二叉树链式结构实现】【二叉树的前序,中序,后序遍历】【求二叉树全部结点个数】【求二叉树叶子结点个数】【求二叉树的深度】【单值二叉树】

一.二叉树链式结构的实现 二叉树的链式结构的实现相对于顺序结构的实现就没有那么多的讲究了。就是普通的链表,只不过多了一个指向的指针。 具体结构如下: typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTre…

ASP+ACCESS客户管理信息系统

摘要 本文介绍了客户管理系统的实现方法。目的在于让大家共享学习和运用这一语言的体会和收获。本系统是Internet/Intranet环境下面向电子商务的客户管理,通过企业管理技术、电子商务和信息技术的高度集成,讨论了客户管理系统的系统构架、系统的工作…

深入理解python列表与字典:数据结构的选择与性能差异

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、列表与字典:基础数据结构的对比 二、列表:逐个遍历的查找方式 …

面试题·栈和队列的相互实现·详解

A. 用队列实现栈 用队列实现栈 实现代码如下 看着是队列,其实实际实现更接近数组模拟 typedef struct {int* queue1; // 第一个队列int* queue2; // 第二个队列int size; // 栈的大小int front1, rear1, front2, rear2; // 两个队列的首尾指针 } MyS…

生成式AI导论2024-李宏毅

生成式AI导论2024-李宏毅 第0讲: 课程说明第1讲:生成式AI是什么第2講:今日的生成式人工智慧厲害在哪裡?從「工具」變為「工具人」 第0讲: 课程说明 生成式AI的入门课程 第1讲:生成式AI是什么 生成式人…

【机器学习】基于核的机器学习算法(Kernel-based Algorithms):原理,应用与优化

👀传送门👀 文章引言🔍🍀核函数的概念🚀基于核的算法原理💖基于核的算法应用🐟支持向量机(SVM)📕核主成分分析(KPCA) 🍀未…

Leetcode42题:接雨水

1.题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,…

ES的安装以及配置+ik分词

环境:windows10、ES(8.13.3)、Kibana(8.13.3)、Logstash(8.13.3)、ik(8.13.3) 1.下载安装ES Download Elasticsearch | ElasticDownload Elasticsearch or the complet…

基于物联网架构的电子小票服务系统

1.电子小票物联网架构 采用感知层、网络层和应用层的3层物联网体系架构模型,电子小票物联网的架构见图1。 图1 电子小票物联网架构 感知层的小票智能硬件能够取代传统的小票打印机,在不改变商家原有收银系统的前提下,采集收音机待打印的购物…

图像处理ASIC设计方法 笔记24 等价表和标记代换

(一)等价表的整理与压缩 1.1 等价关系的识别与追踪 在初步标记过程完成后,等价表的整理和压缩变得至关重要。这一阶段的首要任务是从等价表的地址1开始,对等价表进行逐个扫描。在扫描过程中,系统将检查每个临时标记是否存在等价关系。若发现等价关系,系统将执行追踪过程,…

用c++用4个凸函数(觉得啥好用用啥)去测试adam,rmsprop,adagrad算法的性能(谁先找到最优点)

为了测试 Adam、RMSProp 和 Adagrad 算法的性能,你可以使用四个凸函数进行实验。以下是一些常用的凸函数示例: Rosenbrock 函数: Booth 函数: Himmelblau 函数: Beale 函数: 你可以选择其中一个或多…

企业活动想找媒体报道宣传怎样联系媒体?

在那遥远的公关江湖里,有一个传说,说的是一位勇士,手持鼠标和键盘,踏上了寻找媒体圣杯的征途。这位勇士,就是我们亲爱的市场部门小李,他的任务是为公司即将举行的一场盛大的企业活动找到媒体的聚光灯。 小李的故事,开始于一张空白的Excel表格,上面列着各大媒体的名称,旁边是一片…

4. C++网络编程-TCP客户端的实现

TCP Client网络编程基本步骤 创建socket&#xff0c;指定使用TCP协议使用connect连接服务器使用recv/send接收/发送数据关闭socket TCP-connect连接请求 !man 2 connect #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int connect(int sock…

Aws EC2 + Aws Cli + Terraform

1 什么是 Terraform&#xff1f; Terraform 是由 HashiCorp 创建的“基础架构即代码”(Infrastructure-as-Code&#xff0c;IaC)开源工具。Terraform 的配置语言是 HashiCorp Configuration Language&#xff08;HCL&#xff09;&#xff0c;用来替代更加冗长的 JSON 和 XML 等…

vue数据持久化仓库

本文章是一篇记录实用性vue数据持久化仓的使用&#xff01; 首先在src中创建store文件夹&#xff0c;并创建一个根据本页面相关的名称&#xff0c; 在终端导入&#xff1a;npm i pinia 和 npm i pinia-plugin-persistedstate 接下来引入代码&#xff1a; import { defineSt…