」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > MySQL架構研究及效能最佳化

MySQL架構研究及效能最佳化

發佈於2024-08-21
瀏覽:598

概括

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]刪除
最新教學 更多>
  • Python高效去除文本中HTML標籤方法
    Python高效去除文本中HTML標籤方法
    在Python中剝離HTML標籤,以獲取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    程式設計 發佈於2025-05-25
  • C++20 Consteval函數中模板參數能否依賴於函數參數?
    C++20 Consteval函數中模板參數能否依賴於函數參數?
    [ consteval函數和模板參數依賴於函數參數在C 17中,模板參數不能依賴一個函數參數,因為編譯器仍然需要對非contexexpr futcoriations contim at contexpr function進行評估。 compile time。 C 20引入恆定函數,必須在編譯時進...
    程式設計 發佈於2025-05-25
  • 在GO中構造SQL查詢時,如何安全地加入文本和值?
    在GO中構造SQL查詢時,如何安全地加入文本和值?
    在go中構造文本sql查詢時,在go sql queries 中,在使用conting and contement和contement consem per時,尤其是在使用integer per當per當per時,per per per當per. [&​​&&&&&&&&&&&&&&&默元組方法在...
    程式設計 發佈於2025-05-25
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-05-25
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-05-25
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-05-25
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    程式設計 發佈於2025-05-25
  • C++中如何將獨占指針作為函數或構造函數參數傳遞?
    C++中如何將獨占指針作為函數或構造函數參數傳遞?
    在構造函數和函數中將唯一的指數管理為參數 unique pointers( unique_ptr [2啟示。通過值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法將唯一指針的所有權轉移到函數/對象。指針的內容被移至功能中,在操作...
    程式設計 發佈於2025-05-25
  • Java開發者如何保護數據庫憑證免受反編譯?
    Java開發者如何保護數據庫憑證免受反編譯?
    在java 在單獨的配置文件保護數據庫憑證的最有效方法中存儲憑據是將它們存儲在單獨的配置文件中。該文件可以在運行時加載,從而使登錄數據從編譯的二進製文件中遠離。 使用prevereness class import java.util.prefs.preferences; 公共類示例{ 首選...
    程式設計 發佈於2025-05-25
  • 為什麼不使用CSS`content'屬性顯示圖像?
    為什麼不使用CSS`content'屬性顯示圖像?
    在Firefox extemers屬性為某些圖像很大,&& && && &&華倍華倍[華氏華倍華氏度]很少見,卻是某些瀏覽屬性很少,尤其是特定於Firefox的某些瀏覽器未能在使用內容屬性引用時未能顯示圖像的情況。這可以在提供的CSS類中看到:。 googlepic { 內容:url(&...
    程式設計 發佈於2025-05-25
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-05-25
  • 如何在其容器內為DIV創建平滑的左右CSS動畫?
    如何在其容器內為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-05-25
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-05-25
  • Python不會對超範圍子串切片報錯的原因
    Python不會對超範圍子串切片報錯的原因
    在python中用索引切片範圍:二重性和空序列索引單個元素不同,該元素會引起錯誤,切片在序列的邊界之外沒有。 這種行為源於索引和切片之間的基本差異。索引一個序列,例如“示例” [3],返回一個項目。但是,切片序列(例如“示例” [3:4])返回項目的子序列。 索引不存在的元素時,例如“示例” [9...
    程式設計 發佈於2025-05-25
  • PHP未來:適應與創新
    PHP未來:適應與創新
    PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。 引言在編程世界中,PHP一直是網頁開發的中流砥柱。作為一個從1994年就開始發展...
    程式設計 發佈於2025-05-25

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3