数据库范式、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 能够根据不同的应用需求灵活选择合适的存储引擎,提高数据库系统的适应性和性能。

三、算法与树

(一)常见算法

  1. 顺序查找法
    顺序查找法是一种最基本的查找算法,它从数据集合的开头开始,逐个元素地与目标元素进行比对,直到找到目标元素或者遍历完整个数据集合为止。这种算法的效率相对较低,尤其是在数据量较大的情况下,其时间复杂度为 O (n),其中 n 为数据集合的元素个数。因为它需要依次检查每个元素,没有利用数据的任何特殊结构或排序信息,所以在实际应用中,只有当数据量较小或者没有其他更高效的算法可用时才会考虑使用顺序查找法。

  2. 二分法
    二分法是一种基于分治思想的高效查找算法,前提是数据必须是有序的。它的基本思路是将数据集合一分为二,然后根据目标元素与中间元素的大小关系,确定目标元素可能存在的子区间,然后在该子区间内继续重复上述过程,直到找到目标元素或者确定目标元素不存在。二分法的时间复杂度为 O (log₂n),相比顺序查找法有了显著的提高。例如,在一个包含 1000 个元素的有序数组中查找一个元素,顺序查找法最多需要比较 1000 次,而二分法最多只需要比较 10 次左右(log₂1000 ≈ 10)。二分法在许多实际场景中都有广泛应用,如在有序数据库表中进行数据查找、数值计算中的根查找等。

  3. Hash 算法
    Hash 算法是一种将任意长度的数据映射为固定长度哈希值的算法。其核心原理是通过一个哈希函数对输入数据进行计算,得到一个哈希值。理想的哈希函数应该具有以下特性:一是计算速度快,能够快速地将输入数据转换为哈希值;二是均匀性好,即不同的输入数据尽可能地映射到不同的哈希值,减少哈希冲突;三是确定性,相同的输入数据始终映射到相同的哈希值。Hash 算法在数据存储和检索方面有重要应用,例如在哈希表数据结构中,通过哈希值可以快速定位到数据存储的位置,从而实现快速的数据插入、查找和删除操作。常见的哈希函数有 MD5、SHA - 1 等,但由于安全性等原因,MD5 和 SHA - 1 逐渐被更安全的哈希函数如 SHA - 256 等取代。在数据库索引、密码存储、缓存管理等领域,Hash 算法都发挥着不可或缺的作用。

(二)树

  1. 红黑树
    红黑树是一种自平衡二叉搜索树,在计算机科学领域有着广泛的应用。它的每个节点都被标记为红色或黑色,这也是其名称的由来。除了满足二叉搜索树的基本特性(左子树节点值小于根节点值,右子树节点值大于根节点值)之外,红黑树还具有以下重要特性:

    • 节点颜色为红色或黑色。
    • 根节点必须是黑色。
    • 所有叶子节点都是黑色的空节点(通常用 NIL 节点或 NULL 节点表示)。这一特性保证了从根节点到叶子节点的路径上不存在悬空的分支,使得树的结构更加规整。
    • 每个红色节点的两个子节点都是黑色节点。这一限制确保了从每个叶子节点到根的所有路径上不会出现两个连续的红色节点,从而避免了某些极端不平衡的情况,保证了树的平衡性。
    • 从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。这一特性使得红黑树在进行插入、删除等操作后能够通过相对简单的调整操作(如旋转和颜色变换)来恢复平衡,保证了树的操作效率。红黑树在许多数据结构和算法库中被用于实现高效的动态集合操作,如在 C++ 的 STL 中的 map 和 set 容器底层实现中就用到了红黑树,它能够在 O (log₂n) 的时间复杂度内完成插入、删除和查找操作,适用于对数据动态维护要求较高且需要平衡性能的场景。
  2. B - 树
    B - 树是一种平衡多叉树,与二叉树不同,它的每个节点可以有多个子节点。B - 树的设计目标是为了在磁盘等外部存储设备上高效地存储和检索数据。其主要特点包括:

    • 每个节点可以存储多个关键字和多个子节点指针。关键字的数量通常比子节点指针的数量少 1。例如,一个节点可能存储 5 个关键字和 6 个子节点指针。
    • 所有叶子节点都在同一层,这保证了树的平衡性,使得从根节点到叶子节点的路径长度相同,从而在进行数据查找时能够以较为稳定的时间复杂度进行。
    • 非叶子节点中的关键字起到索引的作用,用于确定数据可能存在的子树范围。在进行数据查找时,从根节点开始,根据关键字与目标值的比较,逐步向下遍历到叶子节点,最终找到目标数据或者确定目标数据不存在。B - 树在数据库索引结构中应用广泛,特别是在大规模数据存储和检索场景中,它能够减少磁盘 I/O 操作次数,提高数据访问效率。因为磁盘的读写操作相对内存来说非常耗时,B - 树的多叉结构使得每个节点能够存储更多的关键字,从而减少了从根节点到叶子节点的路径长度,也就减少了磁盘 I/O 的次数。例如,在一个存储大量记录的数据库表索引中,如果使用二叉树,可能需要多次磁盘读取才能找到目标数据,而使用 B - 树可以在较少的磁盘读取次数内完成查找。
  3. B + 树
    B + 树是 B - 树的一种变体,在数据库索引等领域也有广泛应用。它与 B - 树有一些相似之处,但也有其独特的特性:

    • B + 树的所有数据都存储在叶子节点上,非叶子节点只存储索引关键字和子节点指针,不存储实际数据。这使得 B + 树的内部节点可以存储更多的索引信息,从而进一步提高了树的分支因子,减少了树的高度,提高了数据检索效率。
    • 叶子节点之间通过指针相连,形成一个有序链表。这一特性使得在进行范围查询(如查询某个区间内的所有数据)时非常方便,只需要从起始叶子节点开始,沿着链表顺序遍历即可,无需像 B - 树那样多次回溯到父节点进行范围判断。在数据库系统中,对于经常需要进行范围查询的场景,如查询某个时间段内的订单记录、某个价格区间内的商品信息等,B + 树索引能够提供高效的支持。例如,在一个电商数据库中,商品价格索引使用 B + 树结构,当用户查询价格在 100 - 200 元之间的商品时,数据库可以快速定位到对应的叶子节点范围,然后通过链表顺序读取满足条件的商品信息,大大提高了查询性能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Taro React-Native IOS 打包发布

http网络请求不到 配置 fix react-native facebook::flipper::SocketCertificateProvider‘ (aka ‘int‘) is not a function or func_rn运行debug提示flipper-CSDN博客 Xcode 15(iOS17)编译适配报错_no template named function in namespace std-CS…

基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要:车型识别在交通管理、智能监控和车辆管理中起着至关重要的作用,不仅能帮助相关部门快速识别车辆类型,还为自动化交通监控提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的车型识别模型,该模型使用了…

从python源码到可自动更新软件

相关阅读 标题链接如何打包python程序为exebczl【auto-py-to-exe 可视化打包python到exe】51CTO ZATA 1. python源码 打包时需要特别注意的源码编写规范 除了基本的 Python 编码规范之外,在准备程序进行打包时,还需要特别注意以下几点: 1.1 依赖管理 确保 requirements.t…

javaWeb小白项目--学生宿舍管理系统

目录 一、检查并关闭占用端口的进程 二、修改 Tomcat 的端口配置 三、重新启动 Tomcat 一、javaw.exe的作用 二、结束javaw.exe任务的影响 三、如何判断是否可以结束 结尾: 这个错误提示表明在本地启动 Tomcat v9.0 服务器时遇到了问题,原因是所需…

k8s笔记——核心概念

什么是K8s Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。 Kubernetes 最初是由 Google 工程师作为 Borg 项目开发和设计的,后于 2015 年捐赠给 云原生计算基金会(CNCF)。 什么是 Kubernetes 集群…

SkyWalking-安装

SkyWalking-简单介绍 是一个开源的分布式追踪系统,用于检测、诊断和优化分布式系统的功能。 支持 ElasticSearch、H2、MySQL、PostgreSql 等数据库 基于 ElasticSearch 的情况 ElasticSearch(ES) 安装 1、下载并解压 https://www.elastic…

怎么样绑定域名到AWS(亚马逊云)服务器

1,拿着你买的域名去亚马逊申请一个证书。申请证书分两种,一种是去亚马逊后台填域名手动申请 ,另一种是通过API来申请,类似如下代码: 2、证验证书。有两种方式:一种是通过邮件,另一种去到域名提供…

C++常用的新特性-->day06

时间间隔duration duration表示一段时间间隔&#xff0c;用来记录时间长度&#xff0c;可以表示几秒、几分钟、几个小时的时间间隔。duration的原型如下 // 定义于头文件 <chrono> template<class Rep,class Period std::ratio<1> > class duration;Rep&…

云服务器端口开放

云服务器一般除了必要端口&#xff0c;其它端口默认都是关闭的&#xff0c;要想进行网络通信就必须开放指定的端口。下面以腾讯云服务器为例来进行详细说明。 腾讯云的轻量服务器是没有安全组的&#xff0c;这里有的只是防火墙&#xff0c;开放端口也是通过防火墙来设置的。首先…

[Linux网络编程]10-http协议,分别使用epoll和libevent两种方式实现B/S服务器

一.HTTP协议&#xff0c;Request请求和Response响应 二.常用状态码 接下来使用两种方式构建B/S模型,实现浏览器向客户端请求文件的功能。 浏览器向构建好的服务器发送请求&#xff0c;在请求行中请求具体文件&#xff0c;服务器连通客户端(浏览器)后&#xff0c;检查文件是否存…

C#从入门到放弃

C#和.NET的区别 C# C#是一个编程语言 .NET .NET是一个在window下创建程序的框架 .NET框架不仅局限于C#,它还可以支持很多语言 .NET包括了2个组件&#xff0c;一个叫CLR(通用语言运行时)&#xff0c;另一个是用来构建程序的类库 CLR 用C写一个程序&#xff0c;在一台8688的机器…

Suricata

02-Suricata 一 ICMP流量预警 一条ICMP报文有四个重要内容&#xff0c;可与相应的ICMP关键字相匹配。它们是&#xff1a;消息的类型、代码、ID和序列。 通过ICMP的type进行匹配 alert icmp any any <> any any (msg:"icmp流量预警";itype:8;threshold:type t…

在 WPF 中,如何实现数据的双向绑定?

在 WPF 中&#xff0c;数据绑定是一个非常重要的特性&#xff0c;它允许 UI 与数据源之间自动同步。双向绑定是一种常见的绑定方式&#xff0c;当数据源更新时&#xff0c;UI 会自动更新&#xff1b;同样&#xff0c;当 UI 中的元素&#xff08;如文本框&#xff09;发生改变时…

2、 家庭网络发展现状

上一篇我们讲了了解家庭网络历史(https://blog.csdn.net/xld_hung/article/details/143639618?spm1001.2014.3001.5502),感兴趣的同学可以看对应的文章&#xff0c;本章我们主要讲家庭网络发展现状。 关于家庭网络发展现状&#xff0c;我们会从国内大户型和小户型的网络说起&…

Linux——Linux环境基础开发工具使用

一、软件包管理器yum 在Linux上想要安装一个软件需要下载程序的源代码并且进行编译得到一个可执行的程序。这样会引发很多的问题&#xff0c;第一是这样做很麻烦&#xff1b;第二是我们不知道软件的开发者在开发这款软件的时候用的是一个什么样的环境&#xff0c;我们用不一样的…

Mysql每日一题(行程与用户,困难※)

今天给大家分享一个截止到目前位置&#xff0c;我遇到最难的一道mysql题目&#xff0c;非常建议大家亲手做一遍 完整代码如下&#xff0c;这道题的主要难点是它有两个外键&#xff0c;以前没遇到过&#xff0c;我也没当回事&#xff0c;分享一下错误经验哈 当时我写的where判断…

大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载

随着生成算法、预训练模型、多模态数据分析等AI技术的聚集融合&#xff0c;AIGC技术的实践效用迎来了行业级大爆发。通用大模型技术的成熟推动了新一轮行业生产力变革&#xff0c;在投入提升与政策扶植的双重作用下&#xff0c;以大模型技术为底座、结合专业化金融能力的金融大…

React Native 全栈开发实战班 - 核心组件与导航

在 React Native 中&#xff0c;组件是构建用户界面的基本单元。React Native 提供了丰富的内置组件&#xff0c;涵盖了从基础布局到复杂交互的各种需求。本章节将详细介绍常用的内置组件&#xff0c;并重点讲解列表与滚动视图的使用。 1. 常用内置组件详解 React Native 提供…

检测敏感词功能

今天策划给我一个任务 —— 检测昵称中是否含有敏感词功能&#xff0c;然后丢给我两个压缩包&#xff0c;我解压一看&#xff1a; 有的txt文件是一行一个词&#xff1a; 有的txt文件是按逗号分隔开&#xff1a; 不管是什么格式的总之量非常多&#xff0c;把我这辈子脏话都囊括…

LeetCode59. 螺旋矩阵 II

题目 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 思路 规则 填充上行从左到右 填充右列从上到下 填充下行从右到左 填充左列从下到上 定义上下左右四个基数每行每列填充完后行列…