MySQL缓存参数如何优化与表结构如何优化才算是最大性能的优化

为了最大化 MySQL 的性能,优化缓存参数和表结构是非常重要的。MySQL 提供了多个缓存参数来提高查询效率,而表结构优化可以减少磁盘 I/O,改善查询响应时间。下面我将分别给出如何优化缓存参数以及表结构的详细建议和代码示例。

1. MySQL 缓存参数优化

MySQL 的缓存主要涉及以下几个参数:

  • innodb_buffer_pool_size:InnoDB 存储引擎使用的缓存大小,存放表数据和索引。一般设置为物理内存的 60%-80%。
  • query_cache_size:查询缓存大小。虽然在 MySQL 5.7 后已被弃用,但仍有些场景可以用到,尤其是在有很多重复查询时。
  • key_buffer_size:MyISAM 存储引擎的索引缓存大小。MyISAM 存储引擎已不推荐使用,但在一些旧系统中仍然可能使用。
  • tmp_table_sizemax_heap_table_size:内存临时表的最大大小,避免查询过多使用硬盘临时表。
  • innodb_log_buffer_size:InnoDB 日志缓冲区的大小,适合进行大量写操作时增大。
  • innodb_flush_log_at_trx_commit:控制事务提交时的日志刷新行为。默认值 1 会保证数据的持久性,但也会降低性能,适合对持久性要求较高的场景。如果可以接受某些数据丢失,可以设置为 2 来提高性能。

以下是一个典型的 MySQL 配置文件优化示例(my.cnfmy.ini):

[mysqld]
# InnoDB 缓存优化
innodb_buffer_pool_size = 16G  # 根据服务器内存调整,一般为物理内存的 60%-80%
innodb_log_file_size = 2G  # 大的日志文件有助于提高性能
innodb_flush_log_at_trx_commit = 2  # 性能优化,可能丢失部分事务
innodb_flush_method = O_DIRECT  # 减少磁盘 I/O# 查询缓存(如果有需要的话,MySQL 5.7 之后不推荐使用)
query_cache_type = 1  # 开启查询缓存
query_cache_size = 512M  # 查询缓存大小# 临时表优化
tmp_table_size = 512M  # 内存中临时表的大小
max_heap_table_size = 512M  # 内存中临时表的最大大小# MyISAM 索引缓存(如果还在使用 MyISAM 引擎)
key_buffer_size = 512M  # MyISAM 索引缓存大小# 临时表和内存表的最大大小
max_allowed_packet = 64M

注意

  • innodb_buffer_pool_size 设为物理内存的 60%-80%,以确保数据和索引大部分可以被缓存,从而减少磁盘 I/O。
  • innodb_flush_log_at_trx_commit 设为 2 可以提高性能,但可能会丢失部分事务,通常在对数据一致性要求不那么严格的场景下使用。
  • tmp_table_sizemax_heap_table_size 设置较大,以减少磁盘临时表的使用。

2. 表结构优化

优化表结构是提高数据库性能的另一个重要方面。以下是一些表结构优化的具体方法和代码示例:

(1) 选择合适的数据类型
  • 使用较小的整数类型:根据数据的实际范围选择合适的整数类型。例如,INT 使用 4 字节,而 SMALLINT 只使用 2 字节。
  • 使用合适的字符集:默认的 utf8mb4 会占用更多空间,若不需要支持完整的 Unicode 字符集,可以使用 utf8 或其他字符集。
CREATE TABLE users (id INT UNSIGNED NOT NULL AUTO_INCREMENT,  -- 使用 UNSIGNED,减少负数的存储空间username VARCHAR(50) NOT NULL,             -- 选择合适的字符长度email VARCHAR(100) NOT NULL,age TINYINT UNSIGNED NOT NULL,            -- 使用 TINYINT 代替 INTPRIMARY KEY (id),UNIQUE KEY idx_email (email)              -- 创建索引
);
(2) 使用合适的索引
  • 单列索引:为查询中常用的列添加索引,尤其是 WHEREJOINORDER BYGROUP BY 子句中的列。
  • 联合索引:当查询条件涉及多个列时,可以创建联合索引。联合索引可以显著提高多条件查询的性能。
CREATE INDEX idx_username ON users (username);  -- 单列索引
CREATE INDEX idx_email_age ON users (email, age);  -- 联合索引

注意

  • 避免过多的索引:每增加一个索引,数据库在插入、更新、删除时都会消耗更多时间,因此需要平衡查询速度和写入性能。
  • 索引覆盖查询:确保查询的字段都包含在索引中,这样可以避免额外的回表操作。
(3) 表分区(Partitioning)

对于非常大的表,可以考虑分区表。MySQL 提供了多种分区方法,包括按范围分区、哈希分区等。通过将表分成多个小表,可以提高查询性能。

CREATE TABLE log_data (id INT NOT NULL,log_date DATE NOT NULL,message TEXT,PRIMARY KEY (id, log_date)
)
PARTITION BY RANGE (YEAR(log_date)) (PARTITION p2020 VALUES LESS THAN (2021),PARTITION p2021 VALUES LESS THAN (2022),PARTITION p2022 VALUES LESS THAN (2023)
);
(4) 规范化与反规范化
  • 规范化:将数据拆分成多个表,消除冗余,提高数据一致性。
  • 反规范化:在读取性能要求很高的情况下,可以通过反规范化存储冗余数据,减少 JOIN 操作,提高查询效率。
(5) 避免使用过多的 TEXTBLOB 字段

TEXTBLOB 字段会导致 MySQL 在查询时做额外的 I/O 操作。如果可能,使用 VARCHAR 或者将大字段拆分成多个小字段。

3. 查询优化

优化查询本身也至关重要。以下是一些常见的查询优化策略:

  • **避免 SELECT ***:只查询需要的字段,减少 I/O。
  • 使用 EXPLAIN 分析查询计划:查看查询是否使用了索引,是否有全表扫描。
EXPLAIN SELECT username, email FROM users WHERE age = 25;

4. 总结

  • 缓存优化:通过调整 innodb_buffer_pool_sizequery_cache_size 等参数来减少磁盘 I/O。
  • 表结构优化:根据查询需求选择合适的数据类型,创建合理的索引,考虑表的分区。
  • 查询优化:避免不必要的查询操作,使用 EXPLAIN 分析查询计划。

通过合理的缓存参数和表结构优化,可以显著提高 MySQL 数据库的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

UE5 随机生成地牢关卡

参考视频:【UE5 | 教程 | 地编】虚幻引擎5 中创建史诗级 程序化 地下城_哔哩哔哩_bilibili 首先创建一个父项Actor 这个BOX碰撞提是和地板重叠的 这三个是场景组件,这个ExitsFolder下面的箭头等会会在子蓝图中添加 接下来创建BP_MasterRoom的子蓝图&…

计算机网络:网络层 —— 软件定义网络 SDN

文章目录 软件定义网络 SDN远程控制器OpenFlow协议SDN 广义转发流表简单转发负载均衡防火墙 SDN 控制器 软件定义网络 SDN 软件定义网络(Software Defined Networking,SDN)是一种新兴的网络架构,旨在通过网络控制与数据转发的分离…

软件技术求职简历「优选篇」

【#软件技术简历#】一份精心撰写的简历是增加获得心仪职位的机会。那么,如何才能写出一份既全面又吸引人的软件技术简历呢?以下是幻主简历整理的软件技术简历「优选篇」,欢迎大家阅读收藏! 软件技术简历范文: 求职意向…

MQTT实用示例集:Air201版

今天贴出的是Air201版关于MQTT实用示例集,希望大家喜欢。 本示例教你通过使用脚本代码,对Air201模组进行MQTT链接操作。 操作例程包括: MQTT单链接 MQTT多链接 MQTT SSL不带证书链接 MQTT SSL带证书链接 大家可根据自身需求&#xff0c…

ip地址跟路由器有关吗?更换路由器ip地址会变吗

IP地址与路由器之间的关系是一个涉及计算机网络基础知识的话题。在深入探讨这个问题之前,我们首先需要理解IP地址的基本概念以及它在家庭和企业网络中的作用。 IP地址,即互联网协议地址,是分配给网络上的每个设备的数字标签,用于…

CSS综合练习

该综合练习就是为这个静态网页设置CSS样式&#xff0c;使其变成下面的模样 设置CSS样式前&#xff1a; 设置CSS样式后&#xff1a; 其骨架为&#xff1a; <body><div class"qwq"><img src"top.jpg" alt""></div><d…

神经网络基础--什么是神经网络?? 常用激活函数是什么???

前言 本专栏更新神经网络的一些基础知识&#xff1b;案例代码基于pytorch&#xff1b;欢迎收藏 关注&#xff0c; 本人将会持续更新。 神经网络 1、什么是神经网络 人工神经网络&#xff08; Artificial Neural Network&#xff0c; 简写为ANN&#xff09;也简称为神经网络…

《AI大模型对软件开发流程的重塑:变革、优势、挑战与展望》

《AI大模型对软件开发流程的重塑&#xff1a;变革、优势、挑战与展望》 一、传统软件开发流程与模式&#xff08;一&#xff09;传统软件开发流程&#xff08;二&#xff09;传统软件开发模式面临的问题&#xff08;一&#xff09;AI在软件开发中的应用场景&#xff08;二&…

初识C++(上) -- C++的关键字、命名空间、缺省参数以及函数的重载

目录 一、C的关键字&#xff08;C98&#xff09; 二、命名空间 1、命名冲突 2、命名空间 2.1 命名空间的定义 (1). 命名空间定义的例子以及命名空间的嵌套&#xff1a; (2). 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中&#xff1a; 2…

template和span标签的使用

一&#xff1a;template template是模板占位符&#xff0c;可帮助我们包裹元素&#xff0c;而且循环过程当中&#xff0c;template不会被渲染到页面。 <div>ABC</div> <template v-for"(item, index) in 5"><div>{{ index }}</div>&…

Oracle视频基础1.4.4练习

1.4.4 [dbs] 删干净上次创建的bbk ll rm -f *dbf ll rm -f spfilebbk.ora clear ll创建bbk的pfile&#xff0c;准备对应的目录 ll strings spfilewilson.ora | more strings spfilewilson.ora > initbbk.ora :%s/wilson/bbk :%s/*\.//g :wq ll vi initbbk.ora####### 创…

C# 选择导入文件的路径、导出文件的路径

通过C#代码&#xff0c;调出windows风格的文件选择对话框和存储文件对话框。提供界面来选择文件的位置&#xff0c;并将完整路径以字符串形式返回。 1、选择导入文件&#xff0c;获取其路径 C#通过这段代码将弹出一个文件选择对话框&#xff0c;允许用户选择一个文件&#xff…

孤岛的总面积(Dfs C#

卡码网 101题 力扣第 1254. 统计封闭岛屿的数目 也是一样的 差不多是一道题 101. 孤岛的总面积 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域&…

论文解读 P2《Knowledge Graphs Meet Multi-Modal Learning: A Comprehensive Survey》

论文解读系列文章目录 文章目录 论文解读系列文章目录一、图中公式什么意思&#xff1f;二、“早期的基于匹配和密集嵌入相似性的方法&#xff0c;逐步发展到可学习的检索技术和预训练语言模型&#xff08;PLM&#xff09;生成技术”什么意思&#xff1f;三、在从问题&#xff…

http请求响应详解

http介绍 http协议&#xff1a; Http”协议称为是“超文本传输协议”&#xff08;HTTP-Hypertext transfer protocol&#xff09;。它定义了浏览器怎么向万维网服务器请求万维网文档&#xff0c;以及服务器怎么样把文档传送给浏览器。 https协议&#xff1a; 传统的HTTP协议…

mysql5安全审计

安装插件 插件需要严格与数据库版本适配&#xff0c;不然安装过程中会出现问题 解压插件 cd 插件所在路径unzip audit-plugin-mysql-5.7-1.1.7-921-linux-x86_64.zip#查看mysql默认插件目录 mysql> SHOW GLOBAL VARIABLES LIKE plugin_dir;# 将插件移动到mysql默认插件目…

一文解秘Rust如何与Java互操作

本博客所有文章除特别声明外&#xff0c;均采用CC BY-NC-SA 4.0许可协议。转载请注明来自 唯你 使用场景 JAVA 与 Rust 互操作让 Rust 可以背靠 Java 大生态来做更多事情&#xff0c;而 Java 也可以享受 Rust 语言特性的内存安全&#xff0c;所有权机制&#xff0c;无畏并发。…

架构零散知识点

1 数据库 1.1 数据库范式 有一个学生表&#xff0c;主键是学号&#xff0c;含有学生号、学生名、班级、班级名&#xff0c;违反了数据库第几范式&#xff1f; --非主属性不依赖于主键&#xff0c;不满足第二范式 有一个订单表&#xff0c;包含以下字段&#xff1a;订单ID&…

ZISUOJ 2024算法基础公选课练习一(1)

前言、 又是一年算法公选课&#xff0c;与去年不同的是今年学了一些纯C&#xff08;而不是带类的C&#xff09; 一、我的C模板 1.1 模板1 #include <bits/stdc.h> using i64 long long;int main() {std::cin.tie(nullptr)->sync_with_stdio(false);return 0; } 1…

25.停车场管理系统(基于web的Java项目)

目录 1.系统的受众说明 2.相关技术与方法 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 需求分析 3.2.1 系统功能描述 3.2.2 用例图分析 4. 系统设计 4.1 系统类分析 5. 系统详细设计与实现 5.1 用户登录 5.2 系统信…