我对大型mysql查询有疑问。是否可以跳过mysql对大型查询采取的复制到磁盘上的tmp表步骤,还是可以使其更快?因为这个步骤花了太长时间才能得到我的查询结果。我在MySQL页面上看到mysql执行此操作以节省内存,但我不关心保存内存我只是想让我的查询结果快速恢复,我的机器上有足够的内存。此外,我的表格已正确编入索引,因此这不是我的查询速度慢的原因。
任何帮助?
谢谢
答案 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表 部分(在所选答案中未回答)
支持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/)。
增加变量tmp_table_size和/或max_heap_table_size
但是,如果将查询拆分为较小的查询(不查询将无助于分析问题),则可以使其适合于内存临时表。