我有一个关于大型mysql查询的问题.有没有可能跳过mysql处理大型查询所需的copying to tmp table on disk个步骤,或者有没有可能让它运行得更快?因为这一步要花很长时间才能得到我的查询结果.我在MySQL页面上读到,MySQL执行此操作是为了节省内存,但我不在乎节省内存,我只想快速返回查询结果,我的机器上有足够的内存.此外,我的表被正确地索引,所以这不是我的查询速度慢的原因.
有什么帮助吗?
非常感谢.
我有一个关于大型mysql查询的问题.有没有可能跳过mysql处理大型查询所需的copying to tmp table on disk个步骤,或者有没有可能让它运行得更快?因为这一步要花很长时间才能得到我的查询结果.我在MySQL页面上读到,MySQL执行此操作是为了节省内存,但我不在乎节省内存,我只想快速返回查询结果,我的机器上有足够的内存.此外,我的表被正确地索引,所以这不是我的查询速度慢的原因.
有什么帮助吗?
非常感谢.
你可以做两件事来减轻这种影响
OPTION #1 : Increase the variables 100 and/or 101
这些选项将控制内存中的临时表在被认为太大之前可以有多大,然后作为临时MyISAM表分页到磁盘.这些值越大,"复制到磁盘上的tmp表"的可能性就越小.请确保您的服务器有足够的RAM,如果一个DB连接需要大量的RAM用于自己的临时表,那么max_connections的配置是适度的.
OPTION #2 : Use a RAM disk for tmp tables
您应该能够在Linux中配置一个RAM磁盘,然后将mysql中的tmpdir设置为安装了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.
OPTION #3 : Get tmp table into the RAM Disk ASAP (assuming you apply OPTION #2 first)
您可能希望尽快将tmp表强制放入RAM磁盘中,这样MySQL就不会在将内存中的大型tmp表迁移到RAM磁盘时转动轮子.只需将此添加到/etc/my.cnf:
[mysqld]
tmpdir=/var/tmpfs
tmp_table_size=2K
然后重启mysql. This will cause even the tiniest temp table to be brought into existence right in the RAM disk. You could periodically run ls -l /var/tmpfs
to watch temp tables come and go.
试试看!!!
CAVEAT
如果在/var/tmpfs 24/7中只看到临时表,这可能会影响操作系统的功能/性能.为了确保/var/tmpfs不会变得过多,请仔细调整查询.一旦这样做了,就会在/var/tmpfs中看到更少的tmp表.