数据库范式、MySQL 架构、算法与树的深入解析
一、数据库范式
在数据库设计中,范式是一系列规则,用于确保数据的组织和存储具有良好的结构、完整性以及最小化的数据冗余。如果不遵循范式设计,数据可能会以平铺式罗列,仅使用冒号、分号等简单分隔。这种方式存在诸多弊端,例如在数据搜索时极为不便,数据修改也会变得十分棘手。由此,范式的概念应运而生。
(一)第一范式(1NF)
第一范式要求将平铺式的信息进行拆分,把数据分解成一个个独立的字段。例如对于一个商品的信息,不能将名称、价格、进货时间等混在一起,而应拆分为名称一个字段、价格一个字段、进货时间一个字段等。也就是说,一个字段只描述一件事情,做到列不可再分。这是构建规范化数据库结构的基础步骤,它使得数据在逻辑上更加清晰,便于后续的操作与管理。
(二)第二范式(2NF)
第一范式虽然对数据进行了初步整理,但仍存在不少问题。当存在两个相似的字段时,进行区分查找会非常困难,并且容易产生数据冗余。为解决这些问题,可以为每一条字段添加一个主键 id。通过这个唯一的主键,能够明确地确定每一条数据,从而满足第二范式的要求,即行可以唯一区分。主键的引入不仅解决了数据的唯一性标识问题,还为数据的关联和操作提供了重要依据,有助于提高数据的准确性和完整性。
(三)第三范式(3NF)
单纯运用第一范式和第二范式,在某些情况下还是会出现问题。比如在一个商品表中,如果存在产品类别等与其他核心数据关系不太紧密的字段,当需要修改产品类别时,工作量会很大,因为需要更新所有相关的记录。这时,可将这类字段提取出来建立一个从表,而主表中仅保存从表的主键 id。当需要这些数据时,通过连表查询获取。这样的设计遵循了第三范式,能够有效降低数据修改时的复杂性,提高数据库的可维护性和扩展性。
(四)反范式设计
与范式设计相对的是反范式设计,它从实用角度出发,虽然违反了第三范式。反范式设计是将一些常用的字段从从表中提取出来放入主表中。这样做的主要目的是提高查询效率,因为无需再进行连表查询,能够减少查询时的连接操作和数据传输开销,在一些对查询性能要求较高而对数据更新频率和一致性要求相对较低的场景中具有一定的应用价值。
二、MySQL 基础架构
MySQL 作为一款广泛使用的关系型数据库管理系统,其内部架构设计精巧,各个组件协同工作以处理客户端的 SQL 语句请求。
下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到客户端的一条 SQL 语句在 MySQL 内部是如何执行的。
(一)连接器
连接器主要负责处理与客户端的连接,进行身份认证和权限管理。当用户登录 MySQL 时,连接器会验证用户提供的用户名和密码,并根据预设的权限规则确定用户对数据库资源的访问权限。只有通过身份认证且具有相应权限的用户才能成功连接到 MySQL 并执行后续操作。
(二)查询缓存(MySQL 8.0 版本后移除)
在早期版本中,执行查询语句时,MySQL 会先查询缓存。其原理是将之前执行过的查询语句及其结果缓存起来,如果后续有相同的查询语句,可直接从缓存中获取结果,从而提高查询效率。然而,随着数据库的发展和应用场景的变化,查询缓存逐渐暴露出一些问题,例如缓存命中率不高、缓存管理开销较大等,因此在 MySQL 8.0 版本后被移除,数据库开发人员需要通过其他方式来优化查询性能,如合理设计索引、优化查询语句结构等。
(三)分析器
若查询未命中缓存,则 SQL 语句会进入分析器。分析器首先会解析 SQL 语句,确定其要执行的操作类型,例如是查询数据、插入数据、更新数据还是删除数据等。同时,分析器还会检查 SQL 语句的语法是否正确,如果存在语法错误,将直接报错并终止语句的执行。分析器的工作确保了只有合法且语义明确的 SQL 语句才能进入后续的处理流程,保障了数据库操作的正确性和稳定性。
(四)优化器
优化器在 MySQL 架构中起着关键作用。它会根据数据库的统计信息、索引情况以及查询语句的特点,按照 MySQL 认为最优的方案来执行查询。例如,当存在子查询时,优化器会决定先执行子查询的 SQL 语句;对于多表连接查询,优化器会选择合适的连接顺序和连接算法,以最小化查询的成本,提高查询执行的效率。优化器的智能决策能力使得 MySQL 能够在复杂的查询场景下尽可能快速地返回准确的结果。
(五)执行器
执行器负责执行经优化器确定的执行计划。在执行语句之前,执行器会再次检查用户是否具有执行该语句的权限,如果没有权限,则会报错。若权限验证通过,执行器将从存储引擎读取或写入数据,并将结果返回给客户端。执行器与存储引擎紧密协作,是实现数据操作的最终执行者,它将数据库的逻辑操作转化为对实际存储数据的物理操作,确保数据的一致性和完整性。
(六)插件式存储引擎
MySQL 采用插件式存储引擎架构,支持多种存储引擎,如 InnoDB、MyISAM、Memory 等。不同的存储引擎具有不同的特性和适用场景。InnoDB 是 MySQL 5.5 版本后默认的存储引擎,它支持事务、行级锁和外键约束,具有良好的数据完整性和并发性能,适用于大多数在线事务处理(OLTP)系统。MyISAM 则在读取性能方面表现出色,不支持事务和行级锁,适用于以读为主的场景,如数据仓库等。Memory 存储引擎将数据存储在内存中,读写速度极快,但数据在服务器重启后会丢失,常用于临时数据存储或对性能要求极高且数据量较小的特定应用场景。这种插件式架构使得 MySQL 能够根据不同的应用需求灵活选择合适的存储引擎,提高数据库系统的适应性和性能。
三、算法与树
(一)常见算法
-
顺序查找法
顺序查找法是一种最基本的查找算法,它从数据集合的开头开始,逐个元素地与目标元素进行比对,直到找到目标元素或者遍历完整个数据集合为止。这种算法的效率相对较低,尤其是在数据量较大的情况下,其时间复杂度为 O (n),其中 n 为数据集合的元素个数。因为它需要依次检查每个元素,没有利用数据的任何特殊结构或排序信息,所以在实际应用中,只有当数据量较小或者没有其他更高效的算法可用时才会考虑使用顺序查找法。 -
二分法
二分法是一种基于分治思想的高效查找算法,前提是数据必须是有序的。它的基本思路是将数据集合一分为二,然后根据目标元素与中间元素的大小关系,确定目标元素可能存在的子区间,然后在该子区间内继续重复上述过程,直到找到目标元素或者确定目标元素不存在。二分法的时间复杂度为 O (log₂n),相比顺序查找法有了显著的提高。例如,在一个包含 1000 个元素的有序数组中查找一个元素,顺序查找法最多需要比较 1000 次,而二分法最多只需要比较 10 次左右(log₂1000 ≈ 10)。二分法在许多实际场景中都有广泛应用,如在有序数据库表中进行数据查找、数值计算中的根查找等。 -
Hash 算法
Hash 算法是一种将任意长度的数据映射为固定长度哈希值的算法。其核心原理是通过一个哈希函数对输入数据进行计算,得到一个哈希值。理想的哈希函数应该具有以下特性:一是计算速度快,能够快速地将输入数据转换为哈希值;二是均匀性好,即不同的输入数据尽可能地映射到不同的哈希值,减少哈希冲突;三是确定性,相同的输入数据始终映射到相同的哈希值。Hash 算法在数据存储和检索方面有重要应用,例如在哈希表数据结构中,通过哈希值可以快速定位到数据存储的位置,从而实现快速的数据插入、查找和删除操作。常见的哈希函数有 MD5、SHA - 1 等,但由于安全性等原因,MD5 和 SHA - 1 逐渐被更安全的哈希函数如 SHA - 256 等取代。在数据库索引、密码存储、缓存管理等领域,Hash 算法都发挥着不可或缺的作用。
(二)树
-
红黑树
红黑树是一种自平衡二叉搜索树,在计算机科学领域有着广泛的应用。它的每个节点都被标记为红色或黑色,这也是其名称的由来。除了满足二叉搜索树的基本特性(左子树节点值小于根节点值,右子树节点值大于根节点值)之外,红黑树还具有以下重要特性:- 节点颜色为红色或黑色。
- 根节点必须是黑色。
- 所有叶子节点都是黑色的空节点(通常用 NIL 节点或 NULL 节点表示)。这一特性保证了从根节点到叶子节点的路径上不存在悬空的分支,使得树的结构更加规整。
- 每个红色节点的两个子节点都是黑色节点。这一限制确保了从每个叶子节点到根的所有路径上不会出现两个连续的红色节点,从而避免了某些极端不平衡的情况,保证了树的平衡性。
- 从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。这一特性使得红黑树在进行插入、删除等操作后能够通过相对简单的调整操作(如旋转和颜色变换)来恢复平衡,保证了树的操作效率。红黑树在许多数据结构和算法库中被用于实现高效的动态集合操作,如在 C++ 的 STL 中的 map 和 set 容器底层实现中就用到了红黑树,它能够在 O (log₂n) 的时间复杂度内完成插入、删除和查找操作,适用于对数据动态维护要求较高且需要平衡性能的场景。
-
B - 树
B - 树是一种平衡多叉树,与二叉树不同,它的每个节点可以有多个子节点。B - 树的设计目标是为了在磁盘等外部存储设备上高效地存储和检索数据。其主要特点包括:- 每个节点可以存储多个关键字和多个子节点指针。关键字的数量通常比子节点指针的数量少 1。例如,一个节点可能存储 5 个关键字和 6 个子节点指针。
- 所有叶子节点都在同一层,这保证了树的平衡性,使得从根节点到叶子节点的路径长度相同,从而在进行数据查找时能够以较为稳定的时间复杂度进行。
- 非叶子节点中的关键字起到索引的作用,用于确定数据可能存在的子树范围。在进行数据查找时,从根节点开始,根据关键字与目标值的比较,逐步向下遍历到叶子节点,最终找到目标数据或者确定目标数据不存在。B - 树在数据库索引结构中应用广泛,特别是在大规模数据存储和检索场景中,它能够减少磁盘 I/O 操作次数,提高数据访问效率。因为磁盘的读写操作相对内存来说非常耗时,B - 树的多叉结构使得每个节点能够存储更多的关键字,从而减少了从根节点到叶子节点的路径长度,也就减少了磁盘 I/O 的次数。例如,在一个存储大量记录的数据库表索引中,如果使用二叉树,可能需要多次磁盘读取才能找到目标数据,而使用 B - 树可以在较少的磁盘读取次数内完成查找。
-
B + 树
B + 树是 B - 树的一种变体,在数据库索引等领域也有广泛应用。它与 B - 树有一些相似之处,但也有其独特的特性:- B + 树的所有数据都存储在叶子节点上,非叶子节点只存储索引关键字和子节点指针,不存储实际数据。这使得 B + 树的内部节点可以存储更多的索引信息,从而进一步提高了树的分支因子,减少了树的高度,提高了数据检索效率。
- 叶子节点之间通过指针相连,形成一个有序链表。这一特性使得在进行范围查询(如查询某个区间内的所有数据)时非常方便,只需要从起始叶子节点开始,沿着链表顺序遍历即可,无需像 B - 树那样多次回溯到父节点进行范围判断。在数据库系统中,对于经常需要进行范围查询的场景,如查询某个时间段内的订单记录、某个价格区间内的商品信息等,B + 树索引能够提供高效的支持。例如,在一个电商数据库中,商品价格索引使用 B + 树结构,当用户查询价格在 100 - 200 元之间的商品时,数据库可以快速定位到对应的叶子节点范围,然后通过链表顺序读取满足条件的商品信息,大大提高了查询性能。
相关文章:

数据库范式、MySQL 架构、算法与树的深入解析
一、数据库范式 在数据库设计中,范式是一系列规则,用于确保数据的组织和存储具有良好的结构、完整性以及最小化的数据冗余。如果不遵循范式设计,数据可能会以平铺式罗列,仅使用冒号、分号等简单分隔。这种方式存在诸多弊端&#…...

设计模式之责任链模式(Chain Of Responsibility)
一、责任链模式介绍 1、责任链模式介绍 职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在 一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链 传递请求,直到有一个对…...
SQLite 全文检索:快速高效的文本查询方案
文章目录 什么是全文检索?如何启用 FTS?插入数据执行全文检索关联原始表与 FTS 表数据更新结论 说明: 本文以博客内容全文检索为例。 什么是全文检索? 全文检索是指对文本数据进行索引和查询的一种技术。与常规的 LIKE 查询不同,…...
【微信小程序】报修管理
一、报修管理 报修管理是为方便业主联系维修师傅的一个服务,业主确认需要维修的房到后,再指定维修项目以及上门的时间待待师傅联系上门服务即可。 1.1 在线报修 业主通过在线的方式填写报修的信息,包括房屋信息、维修项目、联系电话、上门…...
C++——视频问题总结
1、C和C的区别 CC面向过程对象注重程序的实现逻辑程序的整体设计内容C语言采用了一种有序的编程方法——结构化编程:将一个大型程序分解为一个个小型的,易于编写的模块,所有模块有序调动,形成了一个程序的完整的运行链C将问题分解…...
Ubuntu24.04 network:0 unclaimed wireless adapter no found
前言: 所遇问题原因在于,折腾显卡cuda版本,导致nvidia驱动没了,使用sudo ubuntu-drivers autoinstall后,驱动有了,但是reboot后无线网卡无法识别,此外usb无线网络也无法使用,ifconfi…...

Java 使用MyBatis-Plus数据操作关键字冲突报错You have an error in your SQL syntax问题
问题 这个报错是出现在Java Spring boot项目中,使用MyBatis-Plus通过创建的实体类对数据库的操作过程中,通过实体创建数据库表是没有问题的,而在接口调用服务类操作数据库的时候,会出现报错。报错详情如下: 服务请求异…...

深入浅出 ChatGPT 底层原理:Transformer
Transformer 在人工智能和自然语言处理领域,Transformer架构的出现无疑是一个里程碑式的突破。它不仅推动了GPT(Generative Pre-trained Transformer)等大型语言模型的发展,还彻底改变了我们处理和理解自然语言的方式。 GPT与Transformer GPT 近几年,人工智能技…...

opc da 服务器数据 转 IEC61850项目案例
目录 1 案例说明 2 VFBOX网关工作原理 3 应用条件 4 查看OPC DA服务器的相关参数 5 配置网关采集opc da数据 6 用IEC61850协议转发数据 7 网关使用多个逻辑设备和逻辑节点的方法 8 在服务器上运行仰科OPC DA采集软件 9 案例总结 1 案例说明 在OPC DA服务器上运行OPC …...

SystemVerilog学习笔记(十一):接口
在Verilog中,模块之间的通信是使用模块端口指定的。 Verilog模块连接的缺点 声明必须在多个模块中重复。存在声明不匹配的风险。设计规格的更改可能需要修改多个模块。 接口 SystemVerilog引入了 interface 结构,它封装了模块之间的通信。一个 inter…...

华大单片机跑历程IO口被写保护怎么解决
一,说明 使用的单片机是HC32F460KETA华大单片机,使用的代码历程是小华单片机历程,具体历程在小华官网都可以找到。 在使用小华历程跑模拟IIC时,SCL时钟是有的,但是IO输入被LOCK了,所以在跑历程进行断点…...

Iotop使用
文章目录 Iotop依赖及编译1:内核配置2: 环境配置3.依赖库ncurses3.1 Ncurses的编译配置 4. Iotop的编译及修改5.测试效果如下: Iotop依赖及编译 源码路径:https://github.com/Tomas-M/iotop#how-to-build-from-source (GitHub - Tomas-M/iotop: A top u…...

定积分的快速计算技巧
快速换元公式——左加右减 对称区间,偶倍奇零 如果遇到对称区间,拿不准是奇函数还是偶函数直接用如下公式: 奇函数时: 偶函数时: arctanx与tanx的和式计算: 周期函数的积分性质 定积分几何意义 定积分的…...

第T7周:Tensorflow实现咖啡豆识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: (二)具体步骤 1. 使…...
imagehash图片去重:保留图片文件名
简介 在日常工作中,我们可能需要管理大量图片,这些图片中可能存在图像相同文件名不同的情况。手动删除这些重复的图片既费时又费力。为了解决这个问题,我们可以编写一个Python脚本来自动化这个过程。 准备工作 在开始之前,请确保…...

在Docker环境下为Nginx配置HTTPS
前言 配置HTTPS已经成为网站部署的必要步骤。本教程将详细介绍如何在Docker环境下为Nginx配置HTTPS,使用自签名证书来实现加密通信。虽然在生产环境中建议使用权威CA机构颁发的证书,但在开发测试或内网环境中,自签名证书是一个很好的选择。 …...

vue面试题9|[2024-11-15]
问题1:scoped原理 1.作用:让样式在本组件中生效,不影响其他组件 2.原理:给节点新增自定义属性,然后css根据属性选择器添加样式。 问题2:让css只在当前组件生效 <style scoped> 问题3:scss…...

大数据技术在金融风控中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 大数据技术在金融风控中的应用 大数据技术在金融风控中的应用 大数据技术在金融风控中的应用 引言 大数据技术概述 定义与原理 发…...

安装一键式重置密码插件(Linux)-CloudResetPwdAgent
为了保证使用镜像创建的裸金属服务器可以实现一键式密码重置功能,建议您在制作镜像时安装重置密码插件“CloudResetPwdAgent”。 前提条件 需保证虚拟机根目录可写入,且剩余空间大于600MB。 1.下载插件包 华为云已提供下载包连接 在PC机里下载好软件…...

如何平滑切换Containerd数据目录
如何平滑切换Containerd数据目录 大家好,我是秋意零。 这是工作中遇到的一个问题。搭建的服务平台,在使用的过程中频繁出现镜像本地拉取不到问题(在项目群聊中老是被人出来😅)原因是由于/目录空间不足导致࿰…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...