数据库范式、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 元之间的商品时,数据库可以快速定位到对应的叶子节点范围,然后通过链表顺序读取满足条件的商品信息,大大提高了查询性能。

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

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

相关文章

Leetcode 存在重复元素II

这段代码的算法思想可以用以下步骤来解释: 算法思想 使用哈希表(HashMap)存储每个元素的索引: 遍历数组 nums 时,使用一个 HashMap 来记录每个元素的值和它的索引位置。这样可以快速查找之前出现过的相同元素的索引。…

Vue3.js - 一文看懂Vuex

1. 前言 Vuex 是 Vue.js 的官方状态管理库,用于在 Vue 应用中管理组件之间共享的状态。Vuex 适用于中大型应用,它将组件的共享状态集中管理,可以避免组件间传递 props 或事件的复杂性。 2. 核心概念 我们可以将Vuex想象为一个大型的Vue&…

面试编程题目(一)细菌总数计算

题目如图: 第一题: import lombok.AllArgsConstructor; import lombok.Data;import java.util.Arrays; import java.util.Collections; import java.util.List;/*** description: 细菌实体类* author: zhangmy* Version: 1.0* create: 2021-03-30 11:2…

基于Qt/C++与OpenCV库 实现基于海康相机的图像采集和显示系统(工程源码可联系博主索要)

本文将梳理一个基于 Qt 和 OpenCV 实现的海康相机图像采集 Demo。该程序能够实现相机连接、参数设置、图像采集与显示、异常处理等功能,并通过 Qt 界面展示操作结果。 1. 功能概述 该程序使用 Qt 的 GUI 作为界面,OpenCV 作为图像处理库,通…

网络基础Linux

目录 计算机网络背景 网络发展 认识 "协议" 网络协议初识 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 网络传输流程图 ​编辑 数据包封装和分用 网络中的地址管理 认识IP地址 认识MAC地址 笔记(画的图) 协议&#x…

大数据新视界 -- 大数据大厂之 Impala 存储格式转换:从原理到实践,开启大数据性能优化星际之旅(下)(20/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

性能调优专题(12)之垃圾收集器ParNewCMS与底层三色标记算法详解

一、垃圾收集算法 1.1 分代收集理论 当前虚拟机的垃圾收集器都采用分代收集理论,只是根据对象存活周期的不同将内存分为几块。一般Java将堆分为新生代和老年代,这样子我们就可以根据各个年代的特点选择合适的垃圾收集算法。 比如在新生代中,每…

JAVA学习日记 ArrayList+LinkedList+迭代器源码分析

一、ArrayList 底层原理: ①利用空参构造的集合,在底层创建一共默认长度为0的数组 ②添加第一个元素时,底层会创建一个新的长度为10的数组 ③存满时,会扩容1.5倍 ④如果一次添加多个元素,1.5倍放不下,…

python+pptx:(二)添加图片、表格、形状、模版渲染

目录 图片 表格 合并单元格 填充色、边距 写入数据 形状 模版渲染 上一篇:pythonpptx:(一)占位符、文本框、段落操作_python输出ppt母版占位符标号-CSDN博客 from pptx import Presentation from pptx.util import Cm, In…

RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)

RDIFramework.NET C/S敏捷开发框架V6.1版本迎来重大更新与调整,全面重新设计业务逻辑代码,代码量减少一半以上,开发更加高效。全系统引入全新字体图标,整个界面焕然一新。底层引入最易上手的ORM框架SqlSugar,让开发更加…

力扣经典面试题

1.本题的目标是判断字符串ransomNote是否由字符串magazine中的字符构成,且由magazine中的每个字符只能在ransomNote中使用一次 2.采用的方法是通过一个字典cahr_countl来统计magazine字符串中每个字符出现的次数 3.然后遍历ransomNote字符串,对于其中的…

安卓aosp15手机上如何离线获取winscope文件

背景: 针对winscope在aosp14高版本的抓取环境搭建问题,前面文章已经给大家一篇业界独家干货文章: android 14版本的winscope编译使用-手把手教你编译成功不报错 这篇文章搭建的winscope的方式同样适用于aosp15版本,只需要使用最新…

【机器学习入门】(1) 线性回归算法

学习目标: 线性回归是一种基本的统计学习方法,主要用于分析一个或多个自变量与因变量之间的线性关系。以下是关于线性回归的一些关键点:线性回归的四要素: (1)假设(hypothesis);(2&…

基于MATLAB身份证号码识别

课题介绍 本课题为基于连通域分割和模板匹配的二代居民身份证号码识别系统,带有一个GUI人机交互界面。可以识别数十张身份证图片。 首先从身份证图像上获取0~9和X共十一个号码字符的样本图像作为后续识别的字符库样本,其次将待测身份证图像…

嵌入式硬件实战提升篇(一)-泰山派RK3566制作多功能小手机

引言:主要针对于嵌入式全栈内容的知识点汇总并对于linux等相关驱动知识点进行串联,用大家参考学习,并用到了嘉立创提供的泰山派RK3566作为学习的主控。 实物演示如下所示: 目录 一、硬件设计 1.转接电路 2.背光电路 3.音频接…

springboot餐厅点餐系统-计算机设计毕业源码14189

目 录 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 餐厅点餐系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 餐厅点餐系统…

制造业7大模式:智能制造、协同制造、绿色制造等思维导图详解

在当今快速变化的市场环境中,制造业正迎来前所未有的变革。从智能工厂的高效运作到网络化制造的全球协同,从云制造的资源共享到3D打印的个性化定制,这些前沿制造模式正在重新定义生产方式,提升企业的竞争力。 今天给大家分享最前沿…

加速 AI 创新:引入 Elastic AI 生态系统

作者:来自 Elastic Alyssa Fitzpatrick, Steve Kearns 生成式人工智能 (Generative AI - GenAI) 正在改变我们所熟知的商业格局。为了简化和加速开发人员构建和部署检索增强生成 (retrieval augmented generation - RAG) 应用程序的方式,Elastic 自豪地宣…

centos rich 美观打印日志

文章目录 步骤 1: 安装 Python 和 pip步骤 2: 安装 rich-cli步骤 3: 验证安装步骤 4: 使用 rich-cli参考 在 CentOS 上安装 rich-cli 工具,你可以按照以下步骤进行操作。rich-cli 是一个命令行工具,用于将 rich 库的功能(例如美化输出&#x…

教育行业企业OKR推行实践案例

一、企业背景与推行前痛点 某教育行业企业,专注于提供高质量的在线教育服务,拥有丰富的课程资源和优秀的教师团队。然而,在快速发展过程中,企业面临着一系列挑战,主要包括: 战略目标模糊:企业高…