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

时间:2011-09-23 16:48:24

标签: mysql sql

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

任何帮助?

谢谢

2 个答案:

答案 0 :(得分: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

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

none                    /var/tmpfs              tmpfs   defaults,size=16g        1 2

并重新启动服务器。

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

现在是MySQL:

在/etc/my.cnf

中添加此行
[mysqld]
tmpdir=/var/tmpfs

并重启mysql。

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

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

[mysqld]
tmpdir=/var/tmpfs
tmp_table_size=2K

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

试一试!!!

<强> CAVEAT

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

答案 1 :(得分:1)

您还可以跳过复制到磁盘上的tmp表 部分(在所选答案中未回答)

  1. 如果避免使用某些数据类型:
  

支持MEMORY不支持的可变长度数据类型(包括BLOB和TEXT)。

     

来自https://dev.mysql.com/doc/refman/8.0/en/memory-storage-engine.html   (如果使用的是mariadb,则为https://mariadb.com/kb/en/library/memory-storage-engine/)。

  1. 如果您的临时表足够小:如所选答案中所述,您可以
      

    增加变量tmp_table_size和/或max_heap_table_size

但是,如果将查询拆分为较小的查询(不查询将无助于分析问题),则可以使其适合于内存临时表。