我有一个 MySQL 表,其中包含一个 44GB 的 .MYD 文件和一个 34GB 的 .MYI 文件。我正在从命令行运行脚本来分析此表中的数据。MySQL 并未达到 CPU 的最大容量,但我的内存已达到最大容量,VMSTAT 报告称数据正在交换到磁盘...但我对这个实用程序及其报告并不太熟悉。
我正在运行高内存 Double XL Amazon EC2 实例。它有 34GB 的 RAM。我不太熟悉 MySQL 调优,系统运行的是 Linux CentOS 上的默认安装。
当前机器是否有足够的内存来高效处理此表?我还需要担心哪些其他配置?我可用的最大系统有 68GB 内存。MySQL 在加载表时究竟将什么加载到内存中?我想更好地了解发生了什么。
答案1
请记住,MyISAM 不会缓存 MyISAM 数据。它仅缓存 MyISAM 索引。
MyISAM 密钥缓存(大小由密钥缓冲区大小) 在 32 位系统中最大为 4GB。在 64 位系统中,您可以增大 MyISAM Key Caches 的大小。
如果您必须缓存整个 .MYI 文件,那么以下内容可能会对您有所帮助:
尝试使用专用的 MyISAM 密钥缓存。
例如,假设您有一个名为 mydb.mytable 的 MyISAM 表,其 .MYI 文件为 34 GB。
以下是为该表设置专用键缓存的方法:
SET GLOBAL my_dedicate_keycache.key_buffer_size = 1024 * 1024 * 1024 * 34;
CACHE INDEX mydb.mytable INTO my_dedicate_keycache;
LOAD INDEX INTO CACHE mydb.mytable;
这个文件好大啊,mysql 启动的时候要怎么加载它呢?
创建一个名为 /var/lib/mysql/startup_stuff.sql 的文件
cd /var/lib/mysql
echo "SET GLOBAL my_dedicate_keycache.key_buffer_size = 1024 * 1024 * 1024 * 34;" > startup_stuff.sql
echo "CACHE INDEX mydb.mytable INTO my_dedicate_keycache;" >> startup_stuff.sql
echo "LOAD INDEX INTO CACHE mydb.mytable;" >> startup_stuff.sql
接下来,将其添加到 /etc/my.cnf
[mysqld]
init_file=/var/lib/mysql/startup_stuff.sql
最后重启mysql
service mysql restart
答案2
下载 mysql 调整器并在尝试导入后运行它。它会告诉您在 /etc/my.cnf 中调整哪些设置如果您正确设置了索引,32GB 的 RAM 应该足够了。