我应该根据 MySQL Tuner 结果优化啥?

Posted

技术标签:

【中文标题】我应该根据 MySQL Tuner 结果优化啥?【英文标题】:What all should I be optimizing based on MySQL Tuner results?我应该根据 MySQL Tuner 结果优化什么? 【发布时间】:2017-03-08 12:10:58 【问题描述】:

-------- 日志文件推荐 ------------------------------



[--] 日志文件:/var/log/mysqld.log(4K)

[OK] 日志文件 /var/log/mysqld.log 存在

[OK] 日志文件 /var/log/mysqld.log 可读。

[OK]日志文件/var/log/mysqld.log不为空

[OK] 日志文件 /var/log/mysqld.log 小于 32 Mb

[!!] /var/log/mysqld.log 包含 21 个警告。

[OK] /var/log/mysqld.log 不包含任何错误。

[--] 在 /var/log/mysqld.log 中检测到 3 个启动

[--] 1) 170307 19:53:17 [注意] /usr/libexec/mysqld: 准备连接。

[--] 2) 170307 19:50:51 [注意] /usr/libexec/mysqld: 准备连接。

[--] 3) 170307 19:47:30 [注意] /usr/libexec/mysqld: 准备连接。

[--] 在 /var/log/mysqld.log 中检测到 3 次关闭

[--] 1) 170307 19:53:17 [注意] /usr/libexec/mysqld: 关机完成

[--] 2) 170307 19:50:51 [注意] /usr/libexec/mysqld: 关机完成

[--] 3) 170307 19:47:29 [注意] /usr/libexec/mysqld: 关机完成

-------- 存储引擎统计 ------------------------------



[--] 状态:+CSV +InnoDB +MRG_MYISAM

[--] MyISAM 表中的数据:33M(表:29)

[--] InnoDB 表中的数据:368M(表:52)

[OK] 碎片表总数:0

-------- 安全建议 ------------------



[!!] 用户“@jobzmachine”是一个匿名帐户。

[!!] 用户“@localhost”是一个匿名帐户。

[!!] 用户“@jobzmachine”未设置密码。

[!!] 用户“@localhost”没有设置密码。

[!!] 用户“@jobzmachine”使用用户名作为密码。

[!!] 用户 '@localhost' 使用用户名作为密码。

[!!] 用户 'backup@%' 没有特定的主机限制。

[!!] 用户 'search@%' 没有特定的主机限制。

[!!]没有基本密码文件列表!

-------- CVE 安全建议 ------------------------------


--

[--] 由于 --cvefile 选项未定义而跳过

-------- 性能指标 ------------------



[--] Up for: 3m 12s (23K q [123.125 qp​​s], 133 conn, TX: 77M, RX: 2M)

[--] 读取/写入:84% / 16%

[--] 二进制日志被禁用

[--] 物理内存:31.2G

[--] MySQL 最大内存:1.6G

[--]其他进程内存:2.3G

[--] 总缓冲区:1.2G 全局 + 2.7M 每个线程(最大 151 个线程)

[--] P_S 最大内存使用量:0B

[--] Galera GCache 最大内存使用量:0B

[OK] 达到的最大内存使用量:1.4G(已安装 RAM 的 4.61%)

[OK] 最大可能的内存使用量:1.6G(已安装 RAM 的 5.04%)

[OK] 与其他进程的总体可能内存使用量与可用内存兼容

[OK] 慢查询:0% (0/23K)

[OK] 可用连接的最高使用率:66% (101/151)

[!!] 中止的连接:13.53% (18/133)

[!!] 由于互斥量争用,默认情况下可能禁用查询缓存。

[OK]查询缓存效率:78.2%(11K缓存/15K选择)

[OK] 每天查询缓存修剪次数:0

[OK] 需要临时表的排序:0%(0 个临时排序/505 个排序)

[!!] 不使用索引执行的连接:1

[!!] 在磁盘上创建的临时表:48%(磁盘上 142 / 总共 292)

[!!] 线程缓存命中率:24%(创建 101 / 133 个连接)

[OK] 表缓存命中率:88%(56打开/63打开)

[OK] 使用的打开文件限制:1% (17/1K)

[OK] 立即获取表锁:100%(5K 立即/5K 锁)

-------- 性能架构 ------------------



[--] 性能架构已禁用。

[--] P_S使用的内存:0B

[--] 未安装系统架构。

-------- 线程池指标 ------------------------------



[--] 线程池统计已禁用。

-------- MyISAM 指标 ------------------------------



[!!] 使用的密钥缓冲区:18.2%(已使用 24M / 134M 缓存)

[OK] 密钥缓冲区大小/MyISAM 索引总数:128.0M/20.6M

[OK] 读取键缓冲区命中率:100.0%(缓存 393K / 0 次读取)

[OK] Write Key 缓冲区命中率:100.0%(1K 缓存/0 次写入)

-------- InnoDB 指标 ------------------------------



[--] InnoDB 已启用。

[--] InnoDB 线程并发:8

[!!] 每个表的 InnoDB 文件未激活

[OK] InnoDB 缓冲池/数据大小:1.0G/368.2M

[!!] InnoDB 日志文件大小 / InnoDB 缓冲池大小 (0.9765625 %) 的比率:5.0M * 2/1.0G 应该等于 25%

[--] InnoDB Buffer Pool Chunk Size 未在您的版本中使用或定义

[OK] InnoDB 读取缓冲区效率:99.95%(5772058 次点击/总共 5774714 次)

[!!] InnoDB 写入日志效率:77.58%(256 次点击/总共 330 次)

[OK] InnoDB 日志等待:0.00%(0 次等待 / 586 次写入)

-------- AriaDB 指标 ------------------------------



[--] AriaDB 已禁用。

-------- TokuDB 指标 ------------------------------



[--] TokuDB 已禁用。

-------- XtraDB 指标 ------------------------------



[--] XtraDB 已禁用。

-------- RocksDB 指标 ------------------------------



[--] RocksDB 已禁用。

-------- 蜘蛛指标 ------------------------------



[--] 蜘蛛被禁用。

-------- 连接指标 ------------------------------



[--] 连接被禁用。

-------- Galera Metrics ------------------------------



[--] Galera 被禁用。

-------- 复制指标 ------------------------------



[--] Galera 同步复制:否

[--] 此服务器没有复制从属服务器。

[--] 这是一个独立的服务器。

-------- 推荐 ------------------



一般建议:

将警告行控制到 /var/log/mysqld.log 文件中

删除匿名用户帐户 - 有 2 个匿名帐户。

使用以下 SQL 语句为用户设置密码 (SET PASSWORD FOR 'user'@'SpecificDNSorIp' = PASSWORD('secure_password'); )

为 user@host 设置安全密码(SET PASSWORD FOR 'user'@'SpecificDNSorIp' = PASSWORD('secure_password'); )

将 user@% 的主机限制为 user@SpecificDNSorIp

MySQL 在过去 24 小时内启动 - 建议可能不准确

减少或消除未关闭的连接和网络问题

调整您的连接查询以始终利用索引

做调整的时候,做tmp_table_size/max_heap_table_

大小相等

减少没有 LIMIT 子句的 SELECT DISTINCT 查询

不应为 MySQL 和 MariaDB 5.5 及更低版本激活性能

考虑从https://github.com/mysql/mysql-sys 安装系统架构

要调整的变量:

query_cache_type (=0)

join_buffer_size(> 128.0K,或始终使用连接索引)

tmp_table_size (> 32M)

max_heap_table_size (> 32M)

thread_cache_size (> 16384)

performance_schema = OFF 禁用 PFS

innodb_file_per_table=开启

innodb_log_file_size * 如果可能的话,innodb_log_files_in_group 应该等于缓冲池大小的 1/4 (=512M)。

【问题讨论】:

【参考方案1】:

MySQL 在过去 24 小时内启动 - 建议可能不准确

只需 3 分钟!没有足够的时间收集很多有用的信息。

但是,通常您不能“调整性能问题”。如果您有缓慢的查询,让我们看看它们,加上相关表的SHOW CREATE TABLE

[OK] InnoDB 缓冲池/数据大小:1.0G/368.2M

你有一个相当小的数据集;你认为它会增长吗?

您的GRANTs 可以让黑客轻松控制您的计算机。

其余的建议大多是次要的——到目前为止。

【讨论】:

【参考方案2】:

在你的 .cfg/.ini 中

thread_cache_size = 100    Current suggested cap to avoid thread creation thrashing.   NOT >16384 as suggested by tuner.

在 24 小时正常运行后需要 MySQLTUNER 以获得更有意义的分析/结果。

【讨论】:

以上是关于我应该根据 MySQL Tuner 结果优化啥?的主要内容,如果未能解决你的问题,请参考以下文章

根据同一张表的结果优化选择表中的所有行?

MySQL删除千万级数据量导致的慢查询优化

我应该为循环的“根”使用啥名称?

使用 Keras Tuner RandomSearch 错误进行超参数调优

将参数发送到 Keras Tuner 模型构建器函数

RESTful API:删除实体 - 我应该返回啥结果?