我有一个关于大型 mysql 查询的问题。是否可以跳过 mysql 用于大型查询的 复制到磁盘上的 tmp 表 步骤,或者是否可以使其更快?因为这一步花费的时间太长,无法恢复我的查询结果。我在 MySQL 页面上读到 mysql 执行此操作以节省内存,但我不关心节省内存我只想快速获取查询结果,我的机器上有足够的内存。此外,我的表已正确编入索引,因此这不是我的查询速度慢的原因。
有什么帮助吗?
谢谢
最佳答案
您可以做两件事来减轻这种影响
选项#1:增加变量tmp_table_size和/或 max_heap_table_size
这些选项将控制内存中的临时表在被认为太大之前可以有多大,然后作为临时 MyISAM 表分页到磁盘。这些值越大,“复制到磁盘上的 tmp 表”的可能性就越小。请确保您的服务器有足够的 RAM 和 max_connections如果单个数据库连接需要大量 RAM 用于其自己的临时表,则配置适度。
选项 #2:为 tmp 表使用 RAM 磁盘
您应该能够在 Linux 中配置 RAM 磁盘,然后设置 tmpdir在 mysql 中作为安装 RAM 磁盘的文件夹。
对于初学者,请在操作系统中配置 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
来观察临时表的来来去去。
试试看!!!
警告
如果您在/var/tmpfs 24/7 中只看到临时表,这可能会影响操作系统的功能/性能。为确保/var/tmpfs 不会过度填充,请考虑调整您的查询。完成后,您应该会在/var/tmpfs 中看到更少的 tmp 表。
关于mysql - 跳过复制到磁盘 mysql 上的 tmp 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7532307/