数据库范式、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.mzph.cn/web/59631.shtml

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

相关文章

SQL面试题——奔驰SQL面试题 车辆在不同驾驶模式下的时间

SQL面试题——奔驰SQL面试题 我们的表大致如下 CREATE TABLE signal_log( vin STRING COMMENTvehicle frame id, signal_name STRING COMMENTfunction name, signal_value STRING COMMENT signal value , ts BIGINT COMMENTevent timestamp, dt STRING COMMENTformat yyyy-mm…

Hadoop生态圈框架部署(六)- HBase完全分布式部署

文章目录 前言一、Hbase完全分布式部署(手动部署)1. 下载Hbase2. 上传安装包3. 解压HBase安装包4. 配置HBase配置文件4.1 修改hbase-env.sh配置文件4.2 修改hbase-site.xml配置文件4.3 修改regionservers配置文件4.4 删除hbase中slf4j-reload4j-1.7.33.j…

YOLOv11改进,YOLOv11添加GnConv递归门控卷积,二次创新C3k2结构

摘要 视觉 Transformer 在多种任务中取得了显著的成功,这得益于基于点积自注意力的新空间建模机制。视觉 Transformer 中的关键因素——即输入自适应、长距离和高阶空间交互——也可以通过卷积框架高效实现。作者提出了递归门控卷积(Recursive Gated Convolution,简称 gnCo…

Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践

案例问题描述 该案例来自一个金融行业客户的问题:他们发现某个应用对一个数据量相对较小的表(仅包含数千条记录)访问时,频繁遇到性能下降的情况。为解决此问题,客户向我们求助进行分析。我们发现这张表有频繁的批量插…

CentOS 8 安装 chronyd 服务

操作场景 目前原生 CentOS 8 不支持安装 ntp 服务,因此会发生时间不准的问题,需使用 chronyd 来调整时间服务。CentOS 8以及 TencentOS 3.1及以上版本的实例都使用 chronyd 服务实现时钟同步。本文介绍了如何在 CentOS 8 操作系统的腾讯云服务器上安装并…

AI大模型(二):AI编程实践

一、软件安装 1. 安装 Visual Studio Code VSCode官方下载:Visual Studio Code - Code Editing. Redefined 根据自己的电脑系统选择相应的版本下载 安装完成! 2. 安装Tongyi Lingma 打开VSCode,点击左侧菜单栏【extensions】,…

Win10/11 安装使用 Neo4j Community Edition

如果你下载的是 Neo4j Community Edition 的压缩包,意味着你需要手动解压并配置 Neo4j。以下是详细的使用步骤: 0. 下载压缩包 访问Neo4j官网,找到 Community Edition 版本并选择 4.x 或者 5.x 下载:https://neo4j.com/deployme…

使用json配置动态区间及动态执行公式

背景 有时候可能线上一直需要调整公式或者区间以及参数等等,如果使用代码方式,将会变得比较麻烦,可以在redis或者数据库配置一份动态配置,让代码进行解析并执行,可以对公式以及参数等进行动态调节 需求 x 是估值&…

腾讯地图GL JS点标识监听:无dragend事件的经纬度获取方案

引入腾讯地图SDK <!--腾讯地图 API--><script charset"utf-8" src"https://map.qq.com/api/gljs?librariestools&v1.exp&key***"></script>构建地图容器 <div class"layui-card"><div class"layui-car…

Tiktok对接和内容发布申请流程

这段时间在搞AI生成视频&#xff0c;希望用户能一键发布到Tiktok&#xff0c;因此研究了一下Tiktok的开发者申请流程&#xff0c;发现好复杂&#xff0c;同时也发现Tiktok的开发也跟我一样&#xff0c;挺草台班子的 0、流程简述 废话不多说&#xff0c;Tiktok的开发者申请和…

企业生产环境-麒麟V10(ARM架构)操作系统部署kafka高可用集群

前言&#xff1a;Apache Kafka是一个分布式流处理平台&#xff0c;由LinkedIn开发并捐赠给Apache软件基金会。它主要用于构建实时数据流管道和流应用。Kafka具有高吞吐量、可扩展性和容错性的特点&#xff0c;适用于处理大量数据。 以下是Kafka的一些核心概念和特性&#xff1…

xcode-select: error: tool ‘xcodebuild‘ requires Xcode, but active developer

打开 .sh 文件所在的终端窗口&#xff0c;执行终端命令&#xff1a;sh 文件名.sh&#xff0c;出现如下错误&#xff1a; 解决办法&#xff1a;

CC6学习记录

&#x1f338; cc6 cc6和cc1的国外链其实后半条链子是一样的&#xff0c;但是cc6的不局限于jdk的版本和commons-collections的版本。 回忆一下cc1的后半条链子&#xff1a; LazyMap.get()->InvokerTransformer.transform() 这里我们就结合了URLDNS链的思路&#xff0c;在…

嵌入式硬件实战基础篇(一)-STM32+DAC0832 可调信号发生器-产生方波-三角波-正弦波

引言&#xff1a;本内容主要用作于学习巩固嵌入式硬件内容知识&#xff0c;用于想提升下述能力&#xff0c;针对学习STM32与DAC0832产生波形以及波形转换&#xff0c;对于硬件的降压和对于前面硬件篇的实际运用&#xff0c;针对仿真的使用&#xff0c;具体如下&#xff1a; 设…

网络安全练习之 ctfshow_web

文章目录 VIP题目限免&#xff08;即&#xff1a;信息泄露题&#xff09;源码泄露前台JS绕过协议头信息泄露robots后台泄露phps源码泄露源码压缩包泄露版本控制泄露源码(git)版本控制泄露源码2(svn)vim临时文件泄露cookie泄露域名txt记录泄露敏感信息公布内部技术文档泄露编辑器…

ReactPress与WordPress:一场内容管理系统的较量

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress WordPress官网&#xff1a;https://wordpress.org/ ReactPress与WordPress&#xff1a;一场内容管理系统的较量 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为…

IDEA调整警告级别【IntelliJ IDEA 2024.2.0.1】

文章目录 目前现状鼠标悬停&#xff0c;选择配置筛选 > 取消选择OK效果 目前现状 需要把提示改成只要显示error的5个 鼠标悬停&#xff0c;选择配置 筛选 > 取消选择 OK 效果

Vue3 + Vite 构建组件库的整体流程

Vue3 Vite 构建组件库的流程 本文教你如何用 Vue Vite&#xff0c;一步一步构建一个组件库并发布到 npm 的整体流程 1. 通过 vite 命令创建一个基本的项目结构&#xff08;这里选用 vue ts 的项目&#xff09; npm create vitelatest2. 在项目中创建一个 lib 目录&#xf…

游戏引擎学习第10天

视频参考:https://www.bilibili.com/video/BV1LyU3YpEam/ 介绍intel architecture reference manual 地址:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html RDTS&#xff08;读取时间戳计数器&#xff09;指令是 x86/x86_64 架构中的…

正则表达式(补充)

定义一个正则表达式 const 变量名 /表达式/ const reg /前端/ 匹配看字符串中有无前端俩字 正则对象上的一些方法 test() 用于查看正则表达式与指定的字符串是否匹配 const reg /前端/ const res reg.test(学前端&#xff0c;找黑马) //匹配到返回true,匹配不到返回fa…