我有一个运行 php eshop 的专用服务器。
该服务器基于 Debian 7.8 64Bit 构建,具有 12 个核心和 64GB RAM。我尝试使用 mysqltuner 脚本来优化我的 mysql 数据库。
当前 query_cache_size 设置为 256MB。我不确定是否应该按照建议继续增加这个数字。
另外,A) 您能告诉我为什么每天的查询缓存修剪次数(111209)如此之高吗?我该如何减少这个数字?B) 为什么表缓存命中率只有 56% 我该如何实现更好的缓存命中率?
MySQLTuner 1.4.0 - 海登少校
错误报告、功能请求和下载请访问http://mysqltuner.com/
使用“--help”运行以获取更多选项和输出过滤
[确定] 使用来自 Debian 维护帐户的凭据登录。
[OK] 当前正在运行支持的 MySQL 版本 5.5.43-0+deb7u1-log
[OK] 在 64 位架构上运行
-------- 存储引擎统计 ----------------------------------------------------------
[--] 状态:+ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MRG_MYISAM
[--] MyISAM 表中的数据:34M(表:157)
[--] InnoDB 表中的数据:422M(表:4)
[--] PERFORMANCE_SCHEMA 表中的数据:0B(表:17)
[!!] 碎片表总数:14
-------- 安全建议 ----------------------------------------------------------
[确定] 所有数据库用户都已分配密码
-------- 性能指标 ------------------------------------------------- [--] 运行时间:12 小时 49 分 55 秒(2M q [59.876 qps]、138K conn、TX:6B、RX:476M)
[--] 读取/写入:76%/24%
[--] 总缓冲区:全局 32.3G + 每个线程 2.8M(最多 600 个线程)
[确定] 最大可能的内存使用量:33.9G(已安装 RAM 的 53%)
[确定] 慢速查询:0% (0/2M)
[OK] 可用连接的最高使用率:1% (9/600)
[确定] 键缓冲区大小/总 MyISAM 索引:16.0M/36.1M
[OK] 密钥缓冲区命中率:100.0% (1B 缓存/17K 读取)
[OK] 查询缓存效率:70.2%(1M 缓存/2M 选择)
[!!] 每天查询缓存修剪次数:111209
[OK] 需要临时表的排序:0% (223 个临时排序/70K 个排序)
[!!] 无索引执行的连接:5298
[确定] 磁盘上创建的临时表:18%(磁盘上 13K/总计 72K)
[OK] 线程缓存命中率:99%(已创建 9 个/138K 个连接)
[OK] 表缓存命中率:56% (239 打开 / 423 已打开)
[确定] 使用的打开文件限制:0%(403 / 1M)
[OK] 立即获取表锁:99% (1M 立即/1M 锁)
[确定] InnoDB 缓冲池/数据大小:32.0G/422.7M
[确定] InnoDB 日志等待:0
-------- 建议 -----------------------------------------------------------------
一般建议:
Run OPTIMIZE TABLE to defragment tables for better performance
MySQL started within last 24 hours - recommendations may be inaccurate
Increasing the query_cache size over 128M may reduce performance
Adjust your join queries to always utilize indexes
需要调整的变量:
query_cache_size (> 256M) [see warning above]
join_buffer_size (> 256.0K, or always use indexes with joins)
答案1
您必须减少连接max_connections
数,直到 12 小时内 138K 内只有 9 个同时连接(定义为 600)。如果足够,则默认为 151 个连接。
您必须将key_buffer_size
MYISAM 索引至少增加到两倍(64MB,256MB 可防止将来出现问题)才能将所有索引放入内存中。
您可以将 InnoDB 缓冲池减少到合理的 2GB 而不是 32GB,而只存在 422MB 的数据。
答案2
您必须使用以下方法来了解数据库的状况: https://www.percona.com/software/percona-toolkit
Percona Toolkit for MySQL 是一套高级命令行工具(由我们自己的 Percona MySQL 支持人员使用),用于执行各种难以手动执行或过于复杂的 MySQL 服务器和系统任务,包括:通过检查主数据和副本数据的一致性来验证 MySQL 复制的完整性;高效地存档行;查找重复的索引;总结 MySQL 服务器;分析来自日志和 tcpdump 的查询;在出现问题时收集重要的系统信息
无论如何,这是我以前最喜欢的脚本之一:
https://github.com/daniel-nichter/hackmysql.com/blob/master/mysqlreport/mysqlreport