我认为知识是一定要系统化的学习,结构化梳理,这样在运用或思考的时候,能够回忆起自己在这一块梳理的知识结构,如果有记录那么能快速回忆并理解,如果没有记录,那么说明对自己来说超纲了,把知识进行分类,写入自己的知识库,那就对知识点有了一个快速的定位和理解。能够梳理清晰自己所学的知识,并定位知识点。这就是我认为系统化知识的意义。

我在学习过程中发现,我自己的思维方式和理解方式,想要学会和理解一个知识点,使用它是最快的方式,将这个知识点实战一次,就基本知道了这东西的作用。

  • 使用层面

1)起步入门:粗读是什么?有什么用?解决了什么问题? 怎么用?(来一个快速实战,上手做一做)

2)运用核心功能:也是基础功能、核心知识点,学习运用功能以及掌握核心知识为主。

3)最佳实践:核心知识要实践,知识运用有无数种方式,最佳实践能避免错误的运用知识。理论是在原理层面指导实践。如果有最佳实践的总结,那便是最好的理论。比如:【关系型数据库设计理论】就是指导如何设计出高质量的关系型数据库。

4)小总结:技术优缺点,适用场景。

学到这里,我可以说我会用 CRUD 了。

当然仅仅会用是不够的,要想用的好、用的灵活,必须要知道它的内部结构和工作原理,比如MySQL ,如果仅仅停留在使用层面,那可能只会CRUD, 如果深入学习了MySQL 内部是B+树索引,二级索引等,那么在创建表时会酌情新增索引,毕竟每新增一个索引就要创建一棵新的B+树,另外在查询表的时候知道如何利用索引高效查询,如果了解MySQL内部有redo log ,DoubleWrtie pool , 就不那么担心 SQL 语句执行过程中断电的问题。知道了 buffer pool ,就明白 InnoDB 是由缓存的,缓存优先存储最常用的数据,这可能为编写SQL 带来一些便利,不过学习到最后明白了 MySQL 调优有限,不如 redis 或者业务优化来的更快更高效。

这便是深入学习和仅仅停留在使用层面的不同之处,我们想要用好一个技术,自然是要学习技术内部原理,明白技术内部是如何工作的,这就是我最喜欢的两个学习思维,学习技术内部层次结构工作流程,这两个方面弄明白了,思维就通畅了。

以今天学到的 MySQL 为例,看看内部层次结构工作流程。直接上图了

这是通用关系型数据库的内部结构图

这是MySQL 内部结构图

这是 InnoDB 内部存储结构图

画出了这三张图,我基本上了解 MySQL 内部结构的全貌,当然以上的图并没有画出 MySQL 的所有结构,所有的部分,随着我对 MySQL 知识面的扩展,我会继续追加,这些图有助于我定位正在学习知识点属于 MySQL 结构的哪一个部分。比如 Doublewrite buffer, 将它定位到结构中,看三分钟文档我就理解了。

我另一个热爱的学习方式是工作流程,看看这玩意是咋工作的,就能把内部结构串起来,理解MySQL 各个结构的作用。当然它的工作流程不止一种,不同情况会有不同的工作流程,可能很多很复杂。不过我们先掌握正常运转的工作流程,意外情况掌握几个经典的~

再拿 MySQL 举例,我们来看看工作原理:

左边红色的块是 Java 程序,集成了 MYSQL 驱动并且引用线程池,避免频繁创建和销毁连接带来的损耗。

中间是发送网络请求,java 应用发送的 SQL 语句的请求在 MySQL 中是由一个个的线程去处理的。

那么可以得出, 一个 SQL 请求会产生 两个活跃的线程:一个在 Java 应用侧等待/处理结果,一个在 MySQL 侧执行 SQL。 注意不是占用哈,占用的意思是拿着不放,活跃的线程是可以调度,切换,阻塞。

右边是MySQL 数据库,同样用一个连接池接收 SQL 请求,线程读取网络请求后在MySQL内部执行。

Java 程序通过网络请求将 SQL 语句字符串发送给 MySQL 服务后,我们看看MySQL 服务内部怎么处理。

1. MYSQL 处理请求流程

  • SQL 接口:MySQL 中处理请求的线程在获取到请求以后获取 SQL 语句去交给 SQL 接口去处理。
  • SQL 解析器:他会将 SQL 接口传递过来的 SQL 语句进行解析,翻译成 MySQL 自己能认识的语言
  • SQL 优化器:MySQL 会帮我去使用他自己认为的最好的方式去优化这条 SQL 语句,并生成一条条的执行计划
  • 存储引擎:查询优化器会调用存储引擎的接口,去执行 SQL,也就是说真正执行 SQL 的动作是在存储引擎中完成的。
  • 执行器:前面那些组件的操作最终必须通过执行器去调用存储引擎接口才能被执行

接下来看看存储引擎做了什么!

2. 存储引擎执行 SQL 流程

1)Buffer Pool (缓冲池)是 InnoDB 存储引擎中非常重要的内存结构, InnoDB 级别的缓存。缓冲池中的数据和数据库(磁盘)中的数据不一致时候,我们就认为缓存中的数据是脏数据

2)undo 日志文件:记录数据被修改前的样子,事务回滚时发挥作用。我们程序是正常运作,这里仅仅记录。

3)redo 日志文件:记录数据被修改后的样子,redo 日志文件是 InnoDB 特有的,他是存储引擎级别的,不是 MySQL 级别的,缓存池更新后记录到缓存日志中,缓存日志默认是立刻写入磁盘。缓存池数据是延迟。

InnoDB 目前整体执行流程:

  • 准备更新一条 SQL 语句
  • MySQL(innodb)会先去缓冲池(BufferPool)中去查找这条数据,没找到就会去磁盘中查找,如果查找到就会将这条数据加载到缓冲池(BufferPool)中
  • 在加载到 Buffer Pool 的同时,会将这条数据的原始记录保存到 undo 日志文件中
  • innodb 会在 Buffer Pool 中执行更新操作
  • 更新后的数据会记录在 redo log buffer 中
  • MySQL 提交事务的时候,会将 redo log buffer 中的数据写入到 redo 日志文件中 刷磁盘可以通过 innodb_flush_log_at_trx_commit 参数来设置
    • 值为 0 表示不刷入磁盘
    • 值为 1 表示立即刷入磁盘
    • 值为 2 表示先刷到 os cache
  • myslq 重启的时候会将 redo 日志恢复到缓冲池中

4) binlog : 记录整个操作过程,bin log 通过追加的方式记录,当文件大小大于给定值后,后续的日志会记录到新的文件上,bin log 适用于主从复制和数据恢复。

bin log 刷盘有三种模式

  • STATMENT :基于 SQL 语句的复制(statement-based replication, SBR),每一条会修改数据的 SQL 语句会记录到 bin log 中
  • ROW:基于行的复制(row-based replication, RBR),不记录每条SQL语句的上下文信息,仅需记录哪条数据被修改了
  • MIXED:基于 STATMENT 和 ROW 两种模式的混合复制( mixed-based replication, MBR ),一般的复制使用 STATEMENT 模式保存 bin log ,对于 STATEMENT 模式无法复制的操作使用 ROW 模式保存 bin log

5) MySQL 会有一个后台线程,它会在某个时机从 Buffer Pool 中挑选出脏数据刷到 MySQL 数据库中

如果在数据被写入到bin log文件的时候,刚写完,数据库宕机了,数据会丢失吗?

首先可以确定的是,只要redo log最后没有 commit 标记,说明本次的事务一定是失败的。但是数据是没有丢失了,因为已经被记录到redo log的磁盘文件中了。在 MySQL 重启的时候,就会将 redo log 中的数据恢复(加载)到Buffer Pool中。

最后返回到查询执行器,经过封装后发回给调用的客户端。

从这两个角度学习新技术,基本上就能掌握技术,但是并不能掌握高级使用场景,比如知道了MySQL 以上内容,当碰到主从复制,读写分离、分库分表的场景还是手足无措。这些都属于MySQL的优化,一门技术核心功能掌握了,肯定要想还能怎么优化,优化到上限是什么?优化的代价又是什么?

当使用分库分表,比如将数据库做了一个水平分库,把一个库分成多个库,这样的数据存在多个数据库中,在高并发场景下,对多个数据库读写肯定比对一个库读写要快不少,做了一个性能优化,这是一种 MySQL 的高阶使用。

分库的代价是什么呢?

此时思维要切换到管理多个数据库带来了什么麻烦?

我们都知道 SQL 语句是在数据库中执行的,也就是说 SQL 中的 Order By 排序仅仅是对于单个数据库排序,而我的数据库有多个,这并不算是对我系统的全部数据排序。

另外还有 count(*) , START TRANSACTION 都会出现这种情况。这是第一个代价,管理数据库变得更复杂。

第二个代价,要把思维切换到存储数据层面,你能想到什么?

ID 要保持唯一性,多个数据库就有可能发生 ID 重复,那么 ID 失去了唯一性还能叫 ID 吗?根据一个ID 查出两个人这合理吗?我不希望有人跟我的身份证同号呀,可想而知这个问题会带来多少麻烦。

问题的解决办法不加以探索了,我要学习一些更核心的知识,毕竟我还是太菜了。

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

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

相关文章

为什么说 Linode 和 DigitalOcean 的差距,不止于 VPS?

在今天这个全球化的商业战场上,中国企业的出海已从“选择题”变为“必答题”。当我们满怀雄心,将产品和业务推向海外市场时,基础设施的选择,往往是决定成败的第一步。它不仅关乎成本与性能,更直接影响着团队的开发效率…

NSSCTF每日一题_Web_[SWPUCTF 2022 新生赛]奇妙的MD5

为了保持做题的感觉和持续学习,也就有了每日一题系列,选一些有意义的题目或者一些CTF新颖题目作为参考学习。[SWPUCTF 2022 新生赛]奇妙的MD51. 访问首页界面并进行分析估计题目MD5提示,查询得知ffifdyop 这个字符串是一个奇妙的MD5字符串因为将“ffifdy…

服务器IP暴露被攻击了怎么办?

当服务器IP暴露后,可能会面临各种网络攻击,如DDoS攻击、端口扫描、恶意入侵等,这将严重影响服务器的正常运行和数据安全。本文将从检测攻击类型、采取紧急防护措施、优化服务器配置、寻求专业支持以及预防未来攻击五个方面,详细探…

TDengine 时间函数 TIMETRUNCATE 用户手册

TDengine TIMETRUNCATE 函数用户使用手册 函数概述 TIMETRUNCATE 是 TDengine 中的一个时间处理标量函数,用于将时间戳按照指定的时间单位进行截断操作。该函数在时间数据聚合、分组和统计分析中非常有用,特别适用于智能电表等时序数据的分析场景。 语…

Linux电脑怎样投屏到客厅的大电视?支持远程投屏吗?

一般的电脑投屏软件都会推出Windows版本和macOS版本,虽然这两个版本已经覆盖大部分消费者的常用电脑,但是依然有一部分群体因为电脑系统版本问题不能使用投屏软件。 如果你当前使用的是Linux系统的电脑,而且又要将电脑投屏投屏到客厅的大电视…

MP4视频太大如何压缩?分享6种简单便捷的压缩小技巧

随着拍摄高清视频的设备越来越多,我们经常会遇到MP4视频文件体积过大的问题,无论是上传到社交平台、发送给朋友,还是存储在设备中,过大的视频文件都会带来诸多不便。那么,MP4视频太大怎么压缩呢?本文将介绍…

k8s 部署 redis

创建部署文件 vim redis.yaml添加如下内容: apiVersion: v1 kind: Namespace metadata:name: redis --- apiVersion: v1 kind: Secret metadata:name: redis-passwordnamespace: redis type: Opaque data:password: d2d3cmhnZWE # 建议生产环境使用更复杂的密码 ---…

FFMPEG H264

一、H264压缩编码1.1 H264 中的 I 帧、P帧和 B帧H264 使用帧内压缩和帧间压缩的方式提高编码压缩率;H264 采用了独特的 I 帧、P 帧和 B 帧策略来实现,连续帧之间的压缩;1.2 其他概念GOP(图像组):一个IDR帧到…

Unity 解决天空盒中间出现一条线

问题解决找到天空盒对应贴图,在Inspector 面板中找到Advanced →Generate Mip Maps 并取消勾选即可。效果动态修改天空盒RenderSettings.skybox targetSkyboxMaterial; DynamicGI.UpdateEnvironment();

Python爬虫实战:研究Showcase模块,构建电商平台销售数据采集和分析系统

1. 引言 1.1 研究背景 在数字经济快速发展的今天,电商平台积累了海量的商品信息、交易数据和用户反馈,这些数据蕴含着丰富的市场洞察。根据中国电子商务研究中心数据,2024 年我国网络零售市场规模突破 15 万亿元,平台商品数据呈现指数级增长。如何高效提取这些数据并转化…

C++中的Reactor和Proactor模型进行系统性解析

<摘要> 本解析系统阐述了网络编程中Reactor与Proactor两种高性能I/O模型的核心概念。Reactor基于同步I/O多路复用&#xff0c;通过事件循环分发通知&#xff0c;由应用层自行完成I/O操作&#xff1b;而Proactor则基于异步I/O&#xff0c;由操作系统完成I/O操作后主动回调…

【技术教程】如何将文档编辑器集成至基于Node.js的网页应用程序中

当今数字化时代&#xff0c;Web应用对在线文档编辑的需求日益增长。无论是构建在线办公系统、内容管理平台还是协作工具&#xff0c;让用户能够直接在浏览器中编辑和处理文档已成为基本需求。 想知道如何为你的 Node.js 应用添加强大的在线文档编辑功能吗&#xff1f;本文手把…

[论文阅读] 人工智能 + 软件工程 | 别让AI写的代码带“漏洞”!无触发投毒攻击的防御困境与启示

别让AI写的代码带“漏洞”&#xff01;无触发投毒攻击的防御困境与启示 论文信息 原标题&#xff1a;Evaluating Defenses Against Trigger-Free Data Poisoning Attacks on NL-to-Code Models&#xff08;评估NL-to-Code模型应对无触发数据投毒攻击的防御方法&#xff09;主要…

【Windows】通过 runas 命令实现多用户权限测试的完整流程

▒ 目录 ▒&#x1f6eb; 导读需求1️⃣ 前期准备&#xff1a;创建管理员/普通测试用户1.1 创建普通用户Test&#xff08;无管理员权限&#xff09;1.2 创建管理员用户Admin&#xff08;含管理员权限&#xff09;2️⃣ 核心操作&#xff1a;通过runas命令切换用户命令行环境2.1…

新后端漏洞(上)- H2 Database Console 未授权访问

漏洞介绍&#xff1a; H2 database是一款Java内存数据库&#xff0c;多用于单元测试。 H2 database自带一个Web管理页面&#xff0c;在Spirng开发中&#xff0c;如果我们设置如下选项&#xff0c;即可允许外部用户访问Web管理页面&#xff0c;且没有鉴权&#xff1a; spring.h2…

2025-09-04 HTML3——区块布局与表单

文章目录1 块元素与行内元素1.1 块元素 (Block-level Element)1.2 行内元素 (Inline Element)2 HTML 布局2.1 使用 <div> 元素2.2 使用 <table> 元素3 表单 (<form>)3.1 输入域&#xff08;<input>&#xff09;3.1.1 文本域&#xff08;Text Fields&am…

云数据库服务(参考自腾讯云计算工程师认证课程)更新中......

数据库基础介绍面临的挑战&#xff1a;数据库系统架构&#xff1a; 数据库DB、数据库管理系统DBMS&#xff08;负责数据库的搭建、使用和维护的系统软件&#xff0c;通过组织、索引、查询、修改数据库文件、实现数据定义、组织、存储、管理以及数据库操作、运行和维护等主要功能…

源滚滚AI编程SillyTavern酒馆配置Claude Code API教程

什么是酒馆 SillyTavern&#xff08;简称 ST&#xff09;是一款本地安装的用户界面&#xff0c;让你能够与文本生成大模型&#xff08;LLM&#xff09;、图像生成引擎以及语音合成&#xff08;TTS&#xff09;模型进行交互。我们的目标是尽可能赋予用户对 LLM 提示词的最大掌控…

软件设计师——软件工程学习笔记

软件工程 一、软件工程基础知识 1. 软件的生存周期&#xff08;1&#xff09;可行性分析与项目开发计划。这个阶段主要确定软件的开发目标及其可行性。参与该阶段的人员有用户、项目负责人、系统分析师。产生的文档有 可行性分析报告、项目开发计划。 &#xff08;2&#xff09…

阿里云ecs 2h2g 实际可用内存不足的情况

Kdump是Linux系统的一种内核崩溃转储机制&#xff0c;它允许在系统发生内核崩溃&#xff08;例如内核panic&#xff09;时&#xff0c;捕获内存的转储信息&#xff0c;从而帮助事后分析故障原因。该过程需要一块预留内存&#xff08;称为crashkernel内存&#xff09;&#xff0…