2011-09-23 68 views
52

我有一个大的MySQL查询的问题。是否有可能跳过拷贝到磁盘上的tmp表中步骤mysql是否需要进行大型查询,还是有可能使其更快?因为这一步骤太长以至于无法将我的查询结果返回。我在MySQL页面上读到了这一点,即mysql执行此操作以节省内存,但我不在意节省内存。我只想将查询结果返回FAST,我的计算机上有足够的内存。此外,我的表格已正确编制索引,因此这不是我的查询速度缓慢的原因。跳过复制到磁盘上的tmp表mysql mysql

任何帮助?

谢谢

+0

我不是MySql的专家,但你可能更适合优化查询和/或架构。 – mxmissile

+8

我投票结束这个“不是真正的问题”。问题不包括要优化的SQL查询,也不包括“SHOW CREATE TABLE”来显示哪些索引,也不包含显示当前优化计划的“EXPLAIN”报告。 –

+2

我必须同意@Bill Karwin需要查看查询,创建表语句和/或EXPLAIN计划。我的答案会解决你所看到的问题,但允许错误的查询来扩充RAM。了解你的查询的性质可能会消除重新配置RAM或MySQL的需要。 – RolandoMySQLDBA

回答

78

有两件事情可以做,以减轻该

选项#1的影响:增加变量tmp_table_size和/或max_heap_table_size

这些选项将决定如何内存中的临时表可能会在它被认为太大之前存在,然后作为临时MyISAM表分页到磁盘。这些值越大,您将越难“复制到磁盘上的tmp表”。请确保您的服务器有足够的RAM,并且max_connections适度配置,如果单个数据库连接需要大量的RAM用于其自己的临时表。

选项2:使用RAM磁盘tmp目录表

你应该能够在Linux中配置一个RAM磁盘,然后设置tmpdir在MySQL中是具有RAM磁盘安装的文件夹。

对于初学者来说,在OS

创建名为/ var在Linux的文件夹配置RAM磁盘/ 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磁盘的ASAP(假设你申请OPTION#2首)

您可能希望尽快让MySQL的做强制TMP表到RAM盘不会将其轮子迁移到RAM磁盘中,将大型内存中的tmp表迁移。只需将其添加到/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表。

+5

其他几点,如果你在Linux上(特别是Ubuntu) 你可能需要添加你的tmpdir路径到(/etc/apparmor.d/usr.sbin.mysqld)应用程序装甲 也不要忘记chmod 777的目录以及! – Dan

+0

当我尝试在ubuntu灯服务器上尝试重新启动mysql时,我的作业无法启动。然后我将它切换回默认的/ tmp并且它可以正常启动。 @Dan你可以给你添加到user.sbin.mysqld的一个例子吗?谢谢 – vikingben

+0

仅供参考,除了添加/etc/apparmor.d/usr/sbin.mysqld之外,我还必须在ubuntu上执行以下操作,我必须添加到/etc/apparmor.d/abstractions/user-tmp以及添加与原始tmp文件夹相同的格式。 – vikingben