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.mzph.cn/pingmian/59549.shtml

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

相关文章

16通道AD采集方案,基于复旦微ARM + FPGA国产SoC处理器平台

测试数据汇总 表 1 本文带来的是基于复旦微FMQL20S400M四核ARM Cortex-A7(PS端) + FPGA可编程逻辑资源(PL端)异构多核SoC处理器设计的全国产工业评估板的AD采集案例。本次案例演示的开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit PL端开发环境:P…

【Python爬虫实战】DrissionPage 与 ChromiumPage:高效网页自动化与数据抓取的双利器

🌈个人主页:易辰君-CSDN博客 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、DrissionPage简介 (一)特点 (二)安装 (三…

R7:糖尿病预测模型优化探索

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、实验目的: 探索本案例是否还有进一步优化的空间 二、实验环境: 语言环境:python 3.8编译器:Jupyter notebo…

HANDLINK ISS-7000v2 网关 login_handler.cgi 未授权RCE漏洞复现

0x01 产品简介 瀚霖科技股份有限公司ISS-7000 v2网络网关服务器是台高性能的网关,提供各类酒店网络认证计费的完整解决方案。由于智慧手机与平板电脑日渐普及,人们工作之时开始使用随身携带的设备,因此无线网络也成为网络使用者基本服务的项目。ISS-7000 v2可登录300至1000…

RK3576 LINUX RKNN SDK 测试

安装Conda工具 安装 Miniforge Conda wget -c https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh chmod 777 Miniforge3-Linux-x86_64.sh bash Miniforge3-Linux-x86_64.shsource ~/miniforge3/bin/activate # Miniforge 安装的…

深入学习指针(5)!!!!!!!!!!!!!!!

文章目录 1.回调函数是什么?2.qsort使用举例2.1使用qsort函数排序整形数据2.2使用sqort排序结构数据 3.qsort函数的模拟实现 1.回调函数是什么? 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针(地址)作为参数传递…

天锐绿盾加密软件与Ping32数据安全防护对比,为企业提供坚实的保障

在当今信息化时代,数据安全已成为企业不可忽视的重要议题。天锐绿盾加密软件与Ping32作为两款备受关注的数据安全解决方案,各自以其卓越的功能和优势,为企业数据安全提供了坚实的保障。 Ping32,同样以其出色的数据加密和防泄密功能…

支持向量机相关证明 解的稀疏性

主要涉及拉格朗日乘子法,对偶问题求解

求职经验分享

更多详情:爱米的前端小笔记,更多前端内容,等你来看!这些都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们的支持才是我不断更新的动力!找…

基于Dpabi和spm12的脑脊液(csf)分割和提取笔记

一、前言 脑脊液(csf)一直被认为与新陈代谢有重要关联,其为许多神经科学研究提供重要价值,从fMRI图像中提取脑脊液信号可用于多种神经系统疾病的诊断。特别是自2019年Science上那篇著名的csf-BOLD文章发表后,大家都试图…

力扣:94--中序遍历二叉树

树 – 二叉树 完全二叉树: 完全二叉树可以用数组完美匹配位置(先序存储:根左右), 推论一 : 位置为k的节点,左孩子:2*k 1 ,右孩子 : 2 * (k 1&…

SQL 常用语句

目录 我的测试环境 学习文档 进入数据库 基础通关测验 语句-- 查 展示数据库; 进入某个数据库; 展示表: 展示某个表 desc 查询整个表: 查询特定列: 范围查询 等于特定值 不等于 介于 特定字符查询 Li…

MySQL utf8mb3 和 utf8mb4引发的问题

问题描述 Cause: java.sql.SQLException: Incorrect string value: \xF4\x8F\xBB\xBF-b... for column sddd_aaa_ark at row 1 sddd_aaa_ark 存储中文字符时,出现上述问题 原因分析 sddd_aaa_ark在数据库中结构是 utf8字符的最大字节数是3 byte,但是某些…

ONLYOFFICE 文档8.2更新评测:PDF 协作编辑、性能优化及更多新功能体验

文章目录 🍀引言🍀ONLYOFFICE 产品简介🍀功能与特点🍀体验与测评ONLYOFFICE 8.2🍀邀请用户使用🍀 ONLYOFFICE 项目介绍🍀总结 🍀引言 在日常办公软件的选择中,WPS 和微软…

SAP-ABAP开发-ONLINE 程序、DIALOG屏幕开发

目录 一、Online 程序概览 1、程序类型 2、Online程序的主要对象 二、界面 1、SAP的屏幕开发 2、屏幕功能实现 3、界面中的事件块(Event Block) 4、界面的创建 三、简单界面元素 1、文本/输入框控件 2、数据检查 3、一些常用的关键字 四、复…

java、excel表格合并、指定单元格查找、合并文件夹

#创作灵感# 公司需求 记录工作内容 后端:JAVA、Solon、easyExcel、FastJson2 前端:vue2.js、js、HTML 模式1:合并文件夹 * 现有很多文件夹 想合并全部全部的文件夹的文件到一个文件夹内 * 每个部门发布的表格 合并全部的表格为方便操作 模…

平替谷歌翻译--沉浸式翻译

这款插件真特么的猛啊!!! 谷歌插件或者油猴插件都有。 沉浸式翻译 - 免费双语对照网页翻译插件

印尼市场潜力无限!用友司库直联助力中企印尼“掘金”

在经济全球化的浪潮下,东南亚市场正焕发出勃勃生机。而其中印度尼西亚作为东盟 大的经济体,被认为是东南亚重要、有活力的市场之一,成为中企出海竞相布局的热门目的地。然而,在积极进军印尼市场的过程中,中国企业普遍面…

【贪心算法】No.1---贪心算法(1)

文章目录 前言一、贪心算法:二、贪心算法示例:1.1 柠檬⽔找零1.2 将数组和减半的最少操作次数1.3 最⼤数1.4 摆动序列1.5 最⻓递增⼦序列1.6 递增的三元⼦序列 前言 👧个人主页:小沈YO. 😚小编介绍:欢迎来到…

自动驾驶---“火热的”时空联合规划

1 背景 早期的不少规划算法都是横纵分离的(比如Apollo),先求解path之后,依赖path的结果再进行speed的求解。这种横纵解耦的规划方式具有以下特点: 相对较为简单,计算量通常较小,容易实现实时性…