加载 50GB+ MySQL 表需要多少内存?

加载 50GB+ MySQL 表需要多少内存?

我有一个 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 Ke​​y 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 应该足够了。

相关内容