首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跳过复制到磁盘mysql上的tmp表

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

Stack Overflow用户
提问于 2011-09-23 16:48:23
回答 2查看 75.4K关注 0票数 68

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

有什么帮助吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-23 18:07:21

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

选项1:增加变量tmp和/或 最大值

这些选项将控制内存中的临时表在被认为太大之前可以有多大,然后将页作为临时的MyISAM表发送到磁盘。这些值越大,“复制到磁盘上的tmp表”的可能性就越小。请确保您的服务器有足够的内存,如果单个DB连接需要大量内存用于自己的临时表,那么最大值的配置是适度的。

选项2:使用RAM磁盘处理tmp表

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

首先,在操作系统中配置RAM磁盘

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

代码语言:javascript
复制
mkdir /var/tmpfs

接下来,将这一行添加到/etc/fstab (例如,如果您想要一个16 to的RAM磁盘)

代码语言:javascript
复制
none                    /var/tmpfs              tmpfs   defaults,size=16g        1 2

重新启动服务器。

注意:可以在不重新启动的情况下制作RAM磁盘。只需记住,在服务器重新启动后,仍要将前面提到的行添加到/etc/fstab,以使RAM磁盘具有。

现在是MySQL:

在/etc/my.cnf中添加这一行

代码语言:javascript
复制
[mysqld]
tmpdir=/var/tmpfs

然后重新启动mysql。

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

您可能希望尽快将tmp表强制放入RAM磁盘,这样MySQL就不会旋转其车轮,将内存中的大型tmp表迁移到RAM磁盘中。只需将此添加到/etc/my.cnf:

代码语言:javascript
复制
[mysqld]
tmpdir=/var/tmpfs
tmp_table_size=2K

然后重新启动mysql。这将导致即使是最小的临时表也会出现在RAM磁盘中。您可以定期运行ls -l /var/tmpfs来查看临时表的来来去去。

试试看!!

警告

如果只看到/var/tmpfs 24/7中的临时表,这可能会影响OS功能/性能。要确保/var/tmpfs不被过度填充,请查看查询的调优。这样做之后,您应该可以看到在/var/tmpfs中实现的tmp表较少。

票数 93
EN

Stack Overflow用户

发布于 2019-06-03 23:17:33

您还可以跳过磁盘部件上的tmp表副本(所选答案中未回答)。

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

支持内存不支持的可变长度数据类型(包括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

但是,如果将查询拆分为较小的查询(没有查询无助于分析问题),则可以将其放入内存临时表中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7532307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档