我有一个关于大型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相关问答推荐

如何显示患者预约中的专业人员姓名?

了解 SQL 中的元组语法

Mysql 相等性反对 false 或 true

MYSQL LOAD DATA INFILE 语句适用于工作台,但不适用于 python

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

如果在表中多次发现 a 列中的相同值,则排除所有行

如何过滤表格,以便它显示最新的数据?

无法在两个 mysql 表上执行内部联接

sql sum - 处理连接表中的脏重复项

判断一对记录是否属于多个组ID

如何在sql中挑出某些名称

MySQL 8.0 上的 phpMyAdmin

导入 data.sql MySQL Docker 容器

ProgrammingError: 在一个线程中创建的 SQLite 对象只能在同一个线程中使用

Yii2 如何进行 where AND 或 OR 条件分组?

拒绝访问;您需要(至少一个)超级权限才能执行此操作

MySQLdb、mysqlclient 和 MySQL 连接器/Python 有什么区别?

MySQL 错误: '访问被拒绝用户'root'@'localhost'

如何在 MySQL 中将结果表转换为 JSON 数组

WooCommerce:在数据库中查找产品