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

Mysql相关问答推荐

如何将MySQL与AS&Quot;语法一起用于存储过程返回的表?

SQL不断返回查询失败,并且不知道从这里到哪里go

默认情况下,MariaDB是否限制为本地主机?

当日期附加到MySQL后,如何按日期说明排序?

在时间戳上搜索大的MySQL表很慢

为什么Mysql会根据查询参数改变查询执行计划?

在带有 D.I 的 .NET AWS Lambda 中使用 MySql.Data

for each 查询设置 MySQL @@session.time_zone 而不是 CONVERT_TZ 的缺点?

mysql insert into select join - 通过连接表将值从一列复制到另一表

从 SQL 中的左连接和内连接中减go 计数

如何使用 IF() 条件在 MySQL 中显示真假行

如何判断嵌套查询返回的元组中的每个条目是否相同?

有没有办法在 Zend Framework 1.5 中执行INSERT...ON DUPLICATE KEY UPDATE?

从mysql中的大表中快速 Select 随机行

utf8mb4_unicode_ci 与 utf8mb4_bin

MySQL 实用程序 - ~/.my.cnf 选项文件

MySQL与空值比较

如何将 MySQL 查询结果存储在另一个表中?

MySQL 更新连接表

如何在 MySQL LIKE 子句中使用用户变量?