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.rhkb.cn/news/466337.html

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

相关文章

如何调整pdf的页面尺寸

用福昕阅读器打开pdf,进入打印页面,选择“属性”,在弹出的页面选择“高级” 选择你想调成的纸张尺寸,然后打印,打印出来的pdf就是调整尺寸后的pdf

WPF中如何简单的使用CommunityToolkit.Mvvm创建一个项目并进行 增删改查

目录 开始前准备的数据库dbblog如下: 第一步:创建项目后下载四个NuGet程序包 第二步:删除原本的MainWindow.XAML文件 并创建如下的目录结构 然后在View文件夹下面创建Login.XAML和Main.XAML 并且在App.XAML中将启动项改为Login.X…

基于python多准则决策分析的汽车推荐算法设计与实现

摘要 随着汽车市场的快速发展和消费者需求的多样化,汽车选择变得愈加复杂。为了帮助消费者在众多汽车选项中做出明智的决策,基于多准则决策分析(MCDA)的汽车推荐算法应运而生。本研究旨在设计和实现一种基于 Python 的汽车推荐系…

xftp连接中不成功 + sudo vim 修改sshd_config不成功的解决方法

我们使用sudo vim不成功,但是我们使用sudo su就可以 了! root用户权利更大! 喵的,终于成功了,一个xftp连接半天不成功。(添加上面的内容就可以连接成功了↑)

vue:Transition

1. Transition 1. 基本用法 <Transition> 是Vue 提供的 “内置组件动画组件”&#xff0c;与一般的CSS过渡动画不同的是&#xff0c;它通过在特点时刻给元素或组件增加、移除类名来实现——在一个元素或组件进入和离开 DOM 时应用过渡动画。 下面是一个基本用法&#…

Python 中的字符串匹配算法

在 Python 中&#xff0c;字符串匹配算法用于在一个字符串中寻找一个子串的出现位置&#xff0c;这是许多文本处理任务的核心。下面我将介绍几种常用的字符串匹配算法以及它们在 Python 中的实现方式。 1、问题背景 在 Python 中&#xff0c;字符串匹配是一个非常重要的操作&a…

配置本地策略路由示例

组网需求 RouterA与RouterB间有两条链路相连。 用户希望实现本机下发的不同长度的报文通过不同的下一跳地址进行转发&#xff0c;其中&#xff1a; 长度为64&#xff5e;1400字节的报文设置192.168.1.2作为下一跳地址。长度为1401&#xff5e;1500字节的报文设置192.168.2.2…

【大数据学习 | kafka高级部分】文件清除原理

2. 两种文件清除策略 kafka数据并不是为了做大量存储使用的&#xff0c;主要的功能是在流式计算中进行数据的流转&#xff0c;所以kafka中的数据并不做长期存储&#xff0c;默认存储时间为7天 那么问题来了&#xff0c;kafka中的数据是如何进行删除的呢&#xff1f; 在Kafka…

推荐一款基于Flash的交互式园林设计工具:Garden Planner

Garden Planner是一款由Artifact Interactive开发的基于Flash的交互式园林设计工具。它允许用户以拖放的方式安排植物、树木、建筑物和各种对象&#xff0c;使园林规划变得简单直观。此外&#xff0c;Garden Planner提供工具来快速创建铺路、路径和围栏&#xff0c;帮助用户设计…

微信小程序开发,诗词鉴赏app,诗词推荐实现(二)

微信小程序开发&#xff0c;诗词鉴赏app&#xff08;一&#xff09;&#xff1a; https://blog.csdn.net/jky_yihuangxing/article/details/143501681微信小程序开发&#xff0c;诗词鉴赏app&#xff0c;诗词推荐实现&#xff08;二&#xff09;:https://blog.csdn.net/jky_yih…

关于诊断中的各种时间参数

前言&#xff1a; 因为不会转载&#xff0c;故在这里贴出原文连接&#xff0c;写的非常好&#xff01;条理清晰&#xff0c;一遍看懂king110108 原文链接&#xff1a;UDS之时间参数总结篇_uds时间参数-CSDN博客 以下内容是我自己对这篇文章的一些备注和理解&#xff0c;以及从测…

技术干货|HyperMesh CFD功能详解:虚拟风洞 Part 2

在上期 Part 1文章中&#xff0c;我们介绍了从 v2023 版本开始&#xff0c;虚拟风洞VWT&#xff08;Virtual Wind Tunnel&#xff09;模块合并到HyperMesh CFD中。用户在VWT模块中完成LBM求解器ultraFluidX的前处理设置&#xff0c;导出参数文件XML和模型文件STL&#xff0c;并…

H7-TOOL的CAN/CANFD助手增加帧发送成功标识支持, 继续加强完善功能细节

2.27版本固件正式携带此功能&#xff0c;包括之前做的负载率检测和错误信息展示也将集成到这个版本固件中。 对于接收&#xff0c;我们可以直接看到效果&#xff0c;而发送不行&#xff0c;所以打算在发送的地方展示下发送成功标识。CAN发送不像串口&#xff0c;需要等待应答后…

mysql5安装

1.下载安装包 https://downloads.mysql.com/archives/community/ mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar tar -xvf mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar2.安装依赖 yum -y install perl yum -y install net-tools yum install numactl libaio libaio-devel -y也可…

大模型应用编排工具Dify二开之工具和模型页面改造

1.前言 简要介绍下 dify&#xff1a; ​ 一款可以对接市面上主流大模型的任务编排工具&#xff0c;可以通过拖拽形式进行编排形成解决某些业务场景的大模型应用。 背景信息&#xff1a; ​ 环境&#xff1a;dify-0.8.3、docker-21 ​ 最近笔者在做 dify的私有化部署和二次…

开放寻址法、链式哈希数据结构详细解读

一、开放寻址法&#xff08;Open Addressing&#xff09; 1. 定义 开放寻址法是一种哈希冲突解决策略&#xff0c;所有元素都存储在哈希表中。当发生冲突时&#xff0c;即两个键计算出的哈希值相同时&#xff0c;会按照一定的探查序列查找下一个可用的位置来存储新元素。 2.…

并查集(基础学习与应用)

并查集 基本原理&#xff1a; 对于多个集合&#xff0c;每个集合中的多个元素用一颗树的形式表示&#xff0c;根节点的编号即为整个集合的编号&#xff0c;每个树上节点存储其父节点&#xff0c;使得当前集合的每个子节点都可以通过对父节点的询问来找到根节点&#xff0c;根…

基于 Encoder-only 架构的大语言模型

基于 Encoder-only 架构的大语言模型 Encoder-only 架构 Encoder-only 架构凭借着其独特的双向编码模型在自然语言处理任务中表现出色&#xff0c;尤其是在各类需要深入理解输入文本的任务中。 核心特点&#xff1a;双向编码模型&#xff0c;能够捕捉全面的上下文信息。 En…

sql数据库-DQL-条件查询

条件查询 SELECT 字段列表 FROM 表名 WHERE 条件列表; 条件列表 比较运算符功能> 大于>大于等于 < 小于<小于等于等于!不等于between...and...某个范围之间&#xff08;闭区间&#xff09;IN(...)在in之后的列表中的值&#xff0c;多选一LIKE 通…

Android CCodec Codec2 (二十)C2Buffer与Codec2Buffer

在阅读Codec2框架代码时&#xff0c;我们可能会发现好几个名称中都带有“buffer”的类&#xff0c;如MediaCodecBuffer、ABuffer、CCodecBuffers、Codec2Buffer以及C2Buffer。它们分别是什么&#xff1f;各自承担着什么功能&#xff1f;它们之间有何联系&#xff1f;本文将围绕…