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

标签 mysql sql

我有一个关于大型 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/

相关文章:

mysql - 使用计算值更新列

mysql - 定义具有多对多关系的两个实体之间的关系

php - 如何在一个以$ result原始值运行的while循环内为$ result分配一个新值?

python - MySQLdb 属性错误 : 'module' object has no attribute 'commit'

python - SqlAlchemy:过滤以匹配列表中的所有值而不是任何值?

php - Adodb:Postgresql 从两个表中选择但返回一组结果

mysql - 导出和导入 mysql 数据库的最佳实践是什么?

mysql - 如何使用两个外键的两个主键创建一个表?

php - Codeigniter 使用 join 进行搜索

sql - 按天均匀分布行