首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

学习 MySQL 必须了解的几个 Undo 概念

Undo 模块的第一篇,聊聊 Undo 相关的几个概念。 > 作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 > 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 > 本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 1. 引子 事务执行过程中,如果改变了(插入、更新、删除)表中数据,会产生 Undo 日志。 Undo 日志会存放到磁盘文件中。用于管理 Undo 日志的逻辑结构,从上往下分为 4 层: 第 1 层:Undo 表空间。 第 2 层:回滚段。 第 3 层:Undo 段。 第 4 层:Undo 页。 接下来,我们从下往上来介绍这 4 层逻辑结构。 2. Undo 页 Undo 页是用于存放 Undo 日志的直接容器。和存放表中数据的页大小一样,Undo 页的大小也默认为 16K。 一个事务产生的 Undo 日志,可能需要一个或者多个 Undo 页来存放。归属于同一个 Undo 段的多个 Undo 页,会形成一个链表。 3. Undo 段 如果一个事务产生了大量 Undo 日志,就需要有很多 Undo 页来存放这些 Undo 日志。 为了管理数量繁多的 Undo 页,InnoDB 使用了一种称为段的逻辑结构。管理 Undo 页的段,称为 Undo 段。 即使一个事务产生的 Undo 日志只需要一个 Undo 页来存放,这一个 Undo 页依然会使用 Undo 段来管理。毕竟,不到事务提交的时候,谁知道它产生的 Undo 日志需要几个 Undo 页来存放呢? 插入记录产生的 Undo 日志,只用于事务回滚,不会用于读取记录的历史版本。事务提交即将完成时,这些 Undo 日志可以直接清除。 更新、删除记录产生的 Undo 日志,既用于事务回滚,也用于读取记录的历史版本,必须等到任何事务都不需要通过这些 Undo 日志读取记录的历史版本时,它们才能被清除。 这两类操作产生的 Undo 日志的清除时机不同,InnoDB 用不同的 Undo 段,来管理存放插入记录、更新和删除记录产生的 Undo 日志的 Undo 页。 虽然 Undo 段的结构一样,但是,代码里对它们进行了区分: Insert Undo 段,用于管理存放插入记录产生的 Undo 日志的 Undo 页。 Update Undo 段,用于管理存放更新、删除记录产生的 Undo 日志的 Undo 页。 4. 回滚段 InnoDB 支持很多个事务并发执行,根据执行的操作不同、表的类型不同,每个读写事务会分配一个或者多个 Undo 段,数量繁多的 Undo 段同样需要被很好的管理起来。 和管理 Undo 页一样,InnoDB 也使用了段来管理 Undo 段,这种段称为回滚段。 每个回滚段都有个段首页,其中包含 1024 个小格子。每个格子占用 4 字节存储空间,用于保存一个 Undo 段的段首页的页号。这意味着一个回滚段可以管理 1024 个 Undo 段。 如果某个小格子暂时没有管理对应的 Undo 段(或者说这个小格子暂时空闲),那么,它存放的就是 4 字节能够表示的最大整数 4294967295,代码里用 FIL_NULL 来表示。 根据表中数据的生命周期,用户创建的表可以分为两类: 用户普通表:MySQL 重启之后,表结构和表中数据都存在。 用户临时表:MySQL 重启之后,表结构存在,表中数据被丢弃。 事务改变(插入、更新、删除)用户普通表的数据,MySQL 重启之后,回滚未提交完成的事务时,需要通过 Undo 日志来把记录恢复到改变之前的样子。这要求保证 Undo 日志不丢失,改变数据产生 Undo 日志的同时,需要产生对应的 Redo 日志,以保证 Undo 日志的持久化。 事务改变(插入、更新、删除)用户临时表的数据,MySQL 重启之后,表中数据就会被丢弃。回滚未提交完成的事务时,不需要把记录恢复到改变之前的样子。这种情况下,不需要保证 Undo 日志不丢失,改变记录产生的 Undo 日志不需要持久化,也就不会产生对应的 Redo 日志。 产生 Undo 日志时,是否需要产生对应的 Redo 日志,两者的性能不同。改变用户普通表、用户临时表的数据,InnoDB 会分配不同的回滚段。 读写事务分配回滚段,可以分为三种情况: 如果事务只改变了用户普通表的数据,分配一个回滚段。 如果事务只改变了用户临时表的数据,分配一个回滚段。 如果事务既改变了用户普通表的数据,又改变了用户临时表的数据,分配两个回滚段。 5. Undo 表空间 磁盘上用于存放 Undo 日志的文件,在逻辑上称为 Undo 表空间。 MySQL 作为一个支持高并发的数据库,允许同时执行很多个事务。根据改变数据的表的类型不同,每个读写事务会分配一个或者两个回滚段,可能会存在比事务数量更多的回滚段。 如果所有回滚段、回滚段管理的 Undo 段、Undo 段管理的 Undo 页,都存放到一个 Undo 表空间中,可能会导致 Undo 表空间文件占用磁盘空间巨大。 虽然 InnoDB 会根据系统变量 innodb_undo_log_truncate、innodb_max_undo_log_size 的值,自动截断 Undo 表空间,把 Undo 表空间文件恢复到初始创建时的大小,但是这有一个条件,就是这个 Undo 表空间中所有回滚段都处于未被使用状态。 如果读写事务不断,只有一个 Undo 表空间,显然就无法做到自动截断了。 那么,想要手动截断可行吗? 靠拼手速,找到一个没有任何读写事务的间隙,显然更不可行了。 为此,InnoDB 支持多个 Undo 表空间。Undo 表空间的数量由系统变量 innodb_undo_tablespaces 控制,默认值为 2(最小值,这意味着至少有 2 个 Undo 表空间),最大值为 127。 既然有了多个 Undo 表空间,每个 Undo 表空间中回滚段的数量,也需要确定下来,不能你多我少,你少我多,大家得一样多,这样才好管理。每个 Undo 表空间中回滚段的数量由系统变量 innodb_rollback_segments 控制,默认值及最大值都为 128,最小值为 1。 6. 总结 Undo 表空间管理回滚段、回滚段管理 Undo 段、Undo 段管理 Undo 页、Undo 页管理 Undo 日志。 InnoDB 支持 2 ~ 127 个表 Undo 表空间,每个 Undo 表空间支持 128 个回滚段,总共支持 256 ~ 16256 个回滚段。 每个回滚段管理 1024 个 Undo 段,总共支持 262144 ~ 16646144 个 Undo 段。 **留个小问题,欢迎评论区留言互动:**只考虑 Undo 段的数量限制,127 个 Undo 表空间最多、最少支持同时执行多少个读写事务? 更多技术文章,请访问:https://opensource.actionsky.com/ 关于 SQLE SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。 ✨ Github:https://github.com/actiontech/sqle 📚 文档:https://actiontech.github.io/sqle-docs/ 💻 官网:https://opensource.actionsky.com/sqle/ 👥 微信群:请添加小助手加入 ActionOpenSource 🔗 商业支持:https://www.actionsky.com/sqle 询问AI

优秀的个人博客,低调大师

PHP 在 2024 年还值得学习吗?

IOBE 在2024年 4 月榜单中曾指出,随着众多竞争对手进入市场以及语言本身出现的一些问题;PHP 已经不复往日辉煌,在 TIOBE 指数中的排名跌至历史最低点(第 17 位)。 在有关 PHP 已经日渐没落的言论四起的背景下,软件工程师 Sotiris Kourouklis近日发布了一篇名为“Is PHP still worth it in 2024 ?”的博客文章,对 PHP 语言进行了一番详尽的分析,探讨该语言在现代 Web开发中的实用性和效率。 并最终得出结论称,PHP 在 2024 年仍然是 Web 开发的一个不错选择。 以下为全文译文: 尽管许多人认为 PHP 是一种古老而不合格的语言,但在 2024 年,它仍然是所有网站中使用最多的语言。它的糟糕名声往往与 WordPress 有关,后者被认为是 21 世纪最糟糕的软件之一。 撇开 WordPress 不谈,让我们快速了解一下 PHP 以及为什么它在 2024 年可能是 Web开发的一个不错选择。 性能 PHP 随着时间的推移正在变得更快,尤其是最新版本,如 PHP 8.1 及以上版本,速度相当快。尽管在某些情况下它可能比 Go 或 Java 等编程语言慢,但在速度上,它至少可以与 Python 或 Node.js 媲美,甚至可能更快。 开发速度 即使你不熟悉PHP,它其实与 Python 非常相似,只有一些细微的差别。这种相似性有助于加快开发速度。从执行简单的CRUD操作,到处理文件、webhook和websocket,几乎所有事情都可以用最少的代码完成。这是因为几乎对于你可能需要完成的任何任务,都有现成的库可用,从而无需你自己编写大量代码。 部署 PHP 的关键优势之一是其部署的简便性,即使是在大规模应用中也是如此。只需一个简单的 PHP 服务器和 nginx,你就可以在几个小时内启动并运行 可扩展性 那么可扩展性如何呢?当然,使用任何编程语言对应用程序进行负载均衡是必要的,尤其是当你每天接到数百万个请求时。但即便你没有,只要你在端点上正确实现缓存,就不会有任何问题。 代码整洁与可读性 在编写整洁代码方面,PHP 可能会出现混乱。然而,使用像 Laravel 这样提供模板的框架就能解决这个问题。即使在拥有超过 20 万行代码(不包括自动生成的文件)的大型 API 中,只要保持代码简单,代码的可读性仍然可以非常高。 我认为唯一更适合编写简洁代码的编程语言是 Python。 结论 总之,建议使用 PHP/Laravel 构建主要的单体 API,因为其强大的框架功能能够简化大型代码库的管理。对于特殊需求,特别是涉及人工智能或其他 CPU 密集型操作的需求,可以考虑使用针对这些任务进行优化的其他编程语言。 这种战略性的划分使你能够利用每种语言和技术的优势,确保项目在效率和可维护性方面表现出色。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册