”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > MySQL架构研究及性能优化

MySQL架构研究及性能优化

发布于2024-08-21
浏览:779

概括

MySQL 是一个基于 C 和 C 编程语言开发的关系数据库管理系统,由 MySQL AB 创建,该公司由 David Axmark、Allan Larsson 和 Michael Widenius 创立。最新版本是MySQL 9.0。

MySQL 是一个具有 GNU 许可证的开源项目。

MySQL是现在最流行、最实用的数据库管理系统,因为它开源、功能齐全、性能高。

建筑学

  • MySQL架构图:来源

Research for MySQL architecture and Optimize performance

客户端层

  • MySQL系统架构第一层。
  • 该层的重要服务是连接处理、身份验证和安全。
    • 连接处理:管理来自客户端的连接。当客户端想要连接到 MySQL 服务器时,会为该连接创建一个新线程。创建新连接时服务器会缓存线程。
    • 身份验证:当客户端连接到服务器时,必须提供身份验证信息才能建立连接。通常,客户端使用用户名和密码进行身份验证。
    • 安全性:MySQL提供了很多功能来保护数据库以及在身份验证后验证用户权限。

服务器层

  • MySQL的下一层负责处理查询语句并提供许多实用程序。
  • 主要特点:
    • 解析器:当客户端请求查询语句时,服务器对其进行分析以创建查询树,重写查询,并定义执行查询语句的顺序和索引。
    • 优化器:它在执行之前优化查询语句。优化器不关心使用什么引擎,但存储引擎可以影响特定查询的优化。
    • 查询缓存:查询缓存存储查询语句的结果。如果客户端再次请求相同的查询,服务器将返回缓存的结果,绕过解析和优化步骤。由于瓶颈问题,此功能在 8.0 或更高版本中已被弃用。
    • 服务和实用程序:
      • 备份与恢复
      • 安全:提供商用户和权限系统
      • 复制:这是一个将数据从主服务器复制并同步到许多子服务器的过程。
      • 分区:使用特定逻辑将表分成多个部分。
      • Workbench:它是一个可视化工具,设计用于与MySQL交互和使用MySQL。

存储层

  • 这是我们在数据库中存储数据的方式的责任层。
  • MySQL默认使用InnoDB存储引擎。
  • MySQL支持多种不同的存储引擎:
    • InnoDB(默认)
    • MyISAM
    • 记忆
    • CSV
    • 档案
    • 黑洞
    • 合并
    • 联邦

优化 MySQL 性能

优化SQL语句

解释声明

  • 不执行查询预测
explain sql_statememnt
  • 执行查询后解释
explain analyze sql_statement

索引技术

  • 它提升了查询和搜索时的性能。
  • 为多列创建索引时,第一列非常重要。它决定查询语句的性能。例如,如果您在(姓名,生日)上创建索引,则使用“姓名”列的查询将利用该索引,但使用“生日”列的查询则不会。
  • 创建新索引的语法:
create index idx_birthday on customers(birthday);
  • 该命令将使查询优化器无法访问指定的索引,从而阻止查询执行计划考虑它:
alter table customers alter index idx_birthday invisible;

分割

  • 当数据库大小大于2GB(或超过1000万条记录)时,应该对该数据库使用分区。
  • 使用分区时,性能将会提高。
  • 分区计划应该基于WHERE子句中经常使用的列。

优化数据库参数

缓冲区高速缓存命中

  • 它是系统从缓冲区缓存而不是从物理存储加载的数据的百分比。
  • 如果百分比低于90%,那么就必须优化。
  • 取决于2个参数:
    • Innodb_buffer_pool_read_requests:发送到缓冲池的请求总数。命令:显示全局状态,如 '%Innodb_buffer_pool_read_requests%
    • Innodb_buffer_pool_reads:内存中缓冲池中找不到的必须从磁盘读取的请求总数。命令:显示全局状态,如 '%Innodb_buffer_pool_reads%
  • 计算公式:
(Innodb_buffer_pool_read_requestss - Innodb_buffer_pool_reads) x100 / Innodb_buffer_pool_read_requests

表缓存命中

  • MySQL会在内存中缓存该表以便快速查询。
  • 如果百分比低于80%,那么就必须优化。
  • 取决于2个参数:
    • Open_tables:在缓存中打开的表总数。命令:显示全局状态,如“Open_tables”
    • Opened_tables:打开的表总数。命令:显示全局状态,如“Opened_tables”
  • 计算公式:Open_tables/Opened_tables

表定义缓存命中

  • 执行查询时,MySQL 需要有关表的信息,例如表名、列数和行数。此信息称为表定义。
  • 如果百分比低于80%,那么就必须优化。
  • 取决于2个参数:
    • Open_table_definitions:缓存中的总定义表。命令:显示全局状态,如“Open_table_definitions”
    • Opened_tables:请求的定义表总数。命令:显示全局状态,如“Opened_tables”
  • 计算公式:Open_table_definitions/Opened_table_definitions

内存中的临时表

  • 许多 SQL 语句(例如 Order、Group By...)必须使用临时表。
  • 如果百分比低于80%,那么就必须优化。
  • 取决于2个参数:
    • Created_tmp_disk_tables:在磁盘上创建的临时表总数。命令:显示全局状态,如“%Created_tmp_disk_tables%”
    • Created_tmp_tables:创建的临时表总数。命令:显示全局状态,如“%Created_tmp_tables%”
  • 计算公式:(Created_tmp_tables - Created_tmp_disk_tables)/ Created_tmp_tables

结论

该博客提供有关 MySQL 的基于研究的知识。 MySQL 是一种关系数据库管理系统,以其低成本、广泛的实用程序和高性能而闻名,使其适用于广泛的项目。虽然本博客涵盖了 MySQL 的许多功能和方面,但还有更多内容值得探索。我将在未来的博客中更深入地研究其他功能和知识。

感谢您的阅读,我们下一篇博客见。

参考文件

  • MySQL 文档
  • MySQL 课程 - Tran Quoc Huy
  • 维基百科 - MySQL
版本声明 本文转载于:https://dev.to/tuantran12/research-for-mysql-architecture-and-optimize-performance-5261?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 何时将成功回调函数与 jQuery Ajax 调用分离?
    何时将成功回调函数与 jQuery Ajax 调用分离?
    从 jQuery Ajax 调用解耦成功回调函数使用 jQuery ajax 从服务器检索数据时,通常的做法是定义成功.ajax() 块中的回调函数。这将回调处理与 AJAX 调用紧密结合在一起,限制了灵活性和可重用性。要在 .ajax() 块之外定义成功回调,通常需要声明一个用于存储返回数据的变量...
    编程 发布于2024-11-03
  • 极简设计初学者指南
    极简设计初学者指南
    我一直是干净和简单的倡导者——这是我的思维最清晰的方式。然而,就像生活中的大多数任务一样,不同的工作有不同的工具,设计也是如此。在这篇文章中,我将分享我发现的极简设计实践,这些实践有助于创建干净简单的网站、模板和图形——在有限的空间内传达必要的内容。 简单可能比复杂更难:你必须努力让你的思维清晰,使...
    编程 发布于2024-11-03
  • 了解 React 应用程序中的渲染和重新渲染:它们如何工作以及如何优化它们
    了解 React 应用程序中的渲染和重新渲染:它们如何工作以及如何优化它们
    当我们在 React 中创建应用程序时,我们经常会遇到术语渲染和重新渲染组件。虽然乍一看这似乎很简单,但当涉及不同的状态管理系统(如 useState、Redux)或当我们插入生命周期钩子(如 useEffect)时,事情会变得有趣。如果您希望您的应用程序快速高效,那么了解这些流程是关键。 ...
    编程 发布于2024-11-03
  • 如何在 Node.js 中将 JSON 文件读入服务器内存?
    如何在 Node.js 中将 JSON 文件读入服务器内存?
    在 Node.js 中将 JSON 文件读入服务器内存为了增强服务器端代码性能,您可能需要读取 JSON 对象从文件到内存以便快速访问。以下是在 Node.js 中实现此目的的方法:同步方法:对于同步文件读取,请利用 fs(文件系统)中的 readFileSync() 方法模块。此方法将文件内容作为...
    编程 发布于2024-11-03
  • 人工智能可以提供帮助
    人工智能可以提供帮助
    我刚刚意识到人工智能对开发人员有很大帮助。它不会很快接管我们的工作,因为它仍然很愚蠢,但是,如果你像我一样正在学习编程,可以用作一个很好的工具。 我要求 ChatGpt 为我准备 50 个项目来帮助我掌握 JavaScript,它带来了令人惊叹的项目,我相信当我完成这些项目时,这些项目将使我成为 J...
    编程 发布于2024-11-03
  • Shadcn UI 套件 - 管理仪表板和网站模板
    Shadcn UI 套件 - 管理仪表板和网站模板
    Shadcn UI 套件是预先设计的多功能仪表板、网站模板和组件的综合集合。它超越了 Shadcn 的标准产品,为那些不仅仅需要基础知识的人提供更先进的设计和功能。 独特的仪表板模板 Shadcn UI Kit 提供了各种精心制作的仪表板模板。目前,有 7 个仪表板模板可用,随着时间...
    编程 发布于2024-11-03
  • 如何使用正则表达式捕获多行文本块?
    如何使用正则表达式捕获多行文本块?
    匹配多行文本块的正则表达式匹配跨多行的文本可能会给正则表达式构造带来挑战。考虑以下示例文本:some Varying TEXT DSJFKDAFJKDAFJDSAKFJADSFLKDLAFKDSAF [more of the above, ending with a newline] [yep, t...
    编程 发布于2024-11-03
  • 软件开发中结构良好的日志的力量
    软件开发中结构良好的日志的力量
    日志是了解应用程序底层发生的情况的关键。 简单地使用 console.log 打印所有值并不是最有效的日志记录方法。日志的用途不仅仅是显示数据,它们还可以帮助您诊断问题、跟踪系统行为以及了解与外部 API 或服务的交互。在您的应用程序在没有用户界面的情况下运行的情况下,例如在系统之间处理和传输数据的...
    编程 发布于2024-11-03
  • 如何在单个命令行命令中执行多行Python语句?
    如何在单个命令行命令中执行多行Python语句?
    在单个命令行命令中执行多行Python语句Python -c 选项允许单行循环执行,但在命令中导入模块可能会导致语法错误。要解决此问题,请考虑以下解决方案:使用 Echo 和管道:echo -e "import sys\nfor r in range(10): print 'rob'&qu...
    编程 发布于2024-11-03
  • 查找数组/列表中的重复元素
    查找数组/列表中的重复元素
    给定一个整数数组,找到所有重复的元素。 例子: 输入:[1,2,3,4,3,2,5] 输出:[2, 3] 暗示: 您可以使用 HashSet 来跟踪您已经看到的元素。如果某个元素已在集合中,则它是重复的。为了保留顺序,请使用 LinkedHashSet 来存储重复项。 使用 HashSet 的 Ja...
    编程 发布于2024-11-03
  • JavaScript 回调何时异步?
    JavaScript 回调何时异步?
    JavaScript 回调:是否异步?JavaScript 回调并非普遍异步。在某些场景下,例如您提供的 addOne 和 simpleMap 函数的示例,代码会同步运行。浏览器中的异步 JavaScript基于回调的 AJAX 函数jQuery 中通常是异步的,因为它们涉及 XHR (XMLHtt...
    编程 发布于2024-11-03
  • 以下是根据您提供的文章内容生成的英文问答类标题:

Why does `char` behave differently from integer types in template instantiation when comparing `char`, `signed char`, and `unsigned char`?
    以下是根据您提供的文章内容生成的英文问答类标题: Why does `char` behave differently from integer types in template instantiation when comparing `char`, `signed char`, and `unsigned char`?
    char、signed char 和 unsigned char 之间的行为差​​异下面的代码可以成功编译,但 char 的行为与整数类型不同。cout << getIsTrue< isX<int8>::ikIsX >() << endl; cou...
    编程 发布于2024-11-03
  • 如何在动态生成的下拉框中设置默认选择?
    如何在动态生成的下拉框中设置默认选择?
    确定下拉框中选定的项目使用 标签创建下拉列表时,您可以可能会遇到需要将特定选项设置为默认选择的情况。这在预填写表单或允许用户编辑其设置时特别有用。在您呈现的场景中, 标记是使用 PHP 动态生成的,并且您希望根据值存储在数据库中。实现此目的的方法如下:设置选定的属性要在下拉框中设置选定的项目,您需...
    编程 发布于2024-11-03
  • Tailwind CSS:自定义配置
    Tailwind CSS:自定义配置
    介绍 Tailwind CSS 是一种流行的开源 CSS 框架,近年来在 Web 开发人员中广受欢迎。它提供了一种独特的可定制方法来创建美观且现代的用户界面。 Tailwind CSS 区别于其他 CSS 框架的关键功能之一是它的可定制配置。在这篇文章中,我们将讨论 Tailwin...
    编程 发布于2024-11-03
  • 使用 jQuery
    使用 jQuery
    什么是 jQuery? jQuery 是一个快速的 Javascript 库,其功能齐全,旨在简化 HTML 文档遍历、操作、事件处理和动画等任务。 “少写多做” MDN 状态: jQuery使得编写多行代码和tsk变得更加简洁,甚至一行代码.. 使用 jQuery 处理事件 jQuery 的另一个...
    编程 发布于2024-11-03

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3