MySQL 高 CPU 使用率(MyISAM 表索引)

tsc*_*lik 3 mysql myisam

我有一个继承的 MySQL 数据库的问题。mysqld 有时会使用高达 2300% 的 CPU。唯一的解决方案是服务 mysql stop 并在表上运行 myisamchk -r。修复索引后,我启动 MySQL,一切正常。

关于永久解决方案的任何想法?

编辑(来自评论):

使用 5.5.29-0ubuntu0.12.04.2-log

key_buffer = 16M 
max_allowed_pa​​cket = 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

Rol*_*DBA 5

建议

的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。我有两个原因:

原因#1

MyISAM 只缓存索引。InnoDB 缓存数据和索引。请参阅我的帖子:InnoDB 和 MyISAM 之间的主要区别是什么?

这将减少用于读取数据和索引的磁盘 I/O。在您的特定情况下,您可以轻松处理 512M 的 InnoDB 缓冲池,并且基本上将所有内容都放入 RAM 中。

原因#2

MyISAM 存储引擎无法访问多个 CPU。InnoDB 可以。事实上,我有很多关于 tweeking InnoDB 的帖子:

结语

我希望你真的考虑从 MyISAM 到 InnoDB 的转换


归档时间:

查看次数:

7520 次

最近记录:

12 年,4 月 前