跳过复制到磁盘mysql上的tmp表

use*_*368 60 mysql sql

我有一个大型mysql查询的问题.是否有可能跳过复制到磁盘上的tmp表步骤mysql用于大型查询或是否可以使其更快?因为这个步骤花了太长时间才能得到我的查询结果.我在MySQL页面上看到mysql执行此操作以节省内存,但我不关心保存内存我只是想让我的查询结果快速恢复,我的机器上有足够的内存.此外,我的表被正确编入索引,这不是我的查询速度慢的原因.

有帮助吗?

谢谢

Rol*_*DBA 84

你可以做两件事来减轻这种影响

选项#1:增加变量tmp_table_size和/或max_heap_table_size

这些选项将控制内存临时表在被认为过大之前的大小,然后将页面作为临时MyISAM表页面.这些值越大,越不可能"复制到磁盘上的tmp表".请确保您的服务器有足够的RAM,并且如果单个数据库连接需要大量RAM用于其自己的临时表,则会适度配置max_connections.

选项#2:将RAM磁盘用于tmp表

您应该能够在Linux中配置RAM磁盘,然后将mysql中的tmpdir设置为安装了RAM磁盘的文件夹.

首先,在OS中配置RAM磁盘

在Linux中创建一个名为/ var/tmpfs的文件夹

mkdir /var/tmpfs
Run Code Online (Sandbox Code Playgroud)

接下来,将此行添加到/ etc/fstab(例如,如果您需要16GB RAM磁盘)

none                    /var/tmpfs              tmpfs   defaults,size=16g        1 2
Run Code Online (Sandbox Code Playgroud)

并重新启动服务器.

注意:可以在不重新启动的情况下制作RAM磁盘.只记得在服务器重启后仍然将上述行添加到/ etc/fstab以获得RAM磁盘.

现在为MySQL:

在/etc/my.cnf中添加此行

[mysqld]
tmpdir=/var/tmpfs
Run Code Online (Sandbox Code Playgroud)

并重启mysql.

选项#3:尽快将tmp表放入RAM磁盘(假设您首先应用选项#2)

您可能希望尽快将tmp表强制进入RAM磁盘,以便MySQL不会将其大的内存tmp表迁移到RAM磁盘中.只需将其添加到/etc/my.cnf:

[mysqld]
tmpdir=/var/tmpfs
tmp_table_size=2K
Run Code Online (Sandbox Code Playgroud)

并重启mysql.这将导致即使是最小的临时表也可以在RAM磁盘中存在.您可以定期运行ls -l /var/tmpfs以观察临时表来去.

试试看 !!!

警告

如果在/ var/tmpfs 24/7中只看到临时表,则可能会影响操作系统的功能/性能.要确保/ var/tmpfs不会过多,请查看调优查询.一旦这样做,您应该会看到在/ var/tmpfs中实现的tmp表更少.

  • 如果您使用的是Linux(特别是ubuntu),还有其他一些要点您可能需要在(/etc/apparmor.d/usr.sbin.mysqld)中添加tmpdir路径到app armor.也不要忘记chmod 777 dir! (5认同)