我有一个继承的 MySQL 数据库的问题。mysqld 有时会使用高达 2300% 的 CPU。唯一的解决方案是服务 mysql stop 并在表上运行 myisamchk -r。修复索引后,我启动 MySQL,一切正常。
关于永久解决方案的任何想法?
编辑(来自评论):
使用 5.5.29-0ubuntu0.12.04.2-log
key_buffer = 16M max_allowed_packet = 16M 线程堆栈 = 128K 线程缓存大小 = 8 myisam-recover = 备份 最大连接数 = 500 #table_cache = 512 #thread_concurrency = 10 query_cache_limit = 1M query_cache_size = 16M
SELECT SUM(index_length) ndxsize
FROM information_schema.tables
WHERE engine='MyISAM'
Run Code Online (Sandbox Code Playgroud)
返回
+-----------+ | ndxsize | +-----------+ | 59862016 | +-----------+
SELECT SUM(data_length+index_length)/power(1024,2) datndxsize
FROM information_schema.tables
WHERE engine='MyISAM'
Run Code Online (Sandbox Code Playgroud)
返回:
+--------------------+ | 数据大小 | +--------------------+ | 488.69915199279785 | +--------------------+
服务器有 16GB 的内存,但它不是数据库服务器......它正在运行 nginx + php-fpm
您的key_buffer_size只有16MB,但你的MyISAM索引总59MB。在一个访问量很大的网站中,我可以看到索引页面经常被踢出并推送到 MyISAM 密钥缓存中。这可能会对更新的索引和 MyISAM 表的整体写入性能产生影响。
您可以key_buffer_size
增加到 64 MB。
您必须将此添加到 /etc/my.cnf
[mysqld]
key_buffer_size=64M
Run Code Online (Sandbox Code Playgroud)
您甚至不需要重新启动 mysql。只需运行这个:
SET @MB = 1024 * 1024;
SET GLOBAL key_buffer_size = @MB * 64;
Run Code Online (Sandbox Code Playgroud)
您还可以转换所有 MyISAM 表的行格式。这将使所使用的磁盘空间增加一倍,读取性能将提高 20-25%。我之前也写过这个:
这是将所有 MyISAM 表转换为固定行格式的脚本
SQLSTMT="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ROW_FORMAT=Fixed;')"
SQLSTMT="${SQLSTMT} FROM information_schema.tables WHERE engine='MyISAM' AND"
SQLSTMT="${SQLSTMT} table_schema NOT IN ('information_schema','mysql','performance_schema')"
mysql -uroot -p -A --skip-column-names -e"${SQLSTMT}" > /root/MakeFixedRows.sql
mysql -uroot -p < /root/MakeFixedRows.sql
Run Code Online (Sandbox Code Playgroud)
鉴于您总共有 488 MB 的 MyISAM 数据和索引,我想提出以下建议:将所有内容切换到 InnoDB。我有两个原因:
MyISAM 只缓存索引。InnoDB 缓存数据和索引。请参阅我的帖子:InnoDB 和 MyISAM 之间的主要区别是什么?
这将减少用于读取数据和索引的磁盘 I/O。在您的特定情况下,您可以轻松处理 512M 的 InnoDB 缓冲池,并且基本上将所有内容都放入 RAM 中。
MyISAM 存储引擎无法访问多个 CPU。InnoDB 可以。事实上,我有很多关于 tweeking InnoDB 的帖子:
Jul 23, 2012
:如何在具有 16 GB RAM 的 QuadCore 机器上充分利用 MySQL?Sep 20, 2011
:多核和 MySQL 性能Sep 12, 2011
:可以让 MySQL 使用多个核心吗?May 26, 2011
:关于单线程与多线程数据库性能我希望你真的考虑从 MyISAM 到 InnoDB 的转换
归档时间: |
|
查看次数: |
7520 次 |
最近记录: |