【问题标题】:How to speed up this DELETE / LEFT JOIN mysql query?如何加快这个 DELETE / LEFT JOIN mysql 查询?
【发布时间】:2014-05-06 05:59:15
【问题描述】:

在 mysql 数据库(在 Linux 上运行)我执行以下查询:

delete m,i from Table1 AS m 
LEFT JOIN 
Table2 AS i 
ON m.GUID = i.OutId 
WHERE m.Direction='in'
AND m.Id<4294967296

这需要将近 2 分钟的时间! Table1 有 458 个条目,Table2 有 5659 个条目。

为什么这个查询会消耗这么多时间?用于计算 Table2 中元素的 COUNT 查询仅使用 0.24 秒进行比较。

如何加快查询速度?哪些部分比较耗时?

附加信息:

  • 我不是sql专家
  • 我尝试通过运行alter table Table add index (GUID);(以及其他列的类似命令)向表添加索引,但它似乎对时间消耗没有影响。我在这里做错了吗?
  • 必须在不改变表结构的情况下进行“优化”或任何操作。

【问题讨论】:

  • 检查JOIN条件中的列是否有索引。还要检查这些表是否有任何删除触发器。
  • 能否请您“解释”查询以了解优化器如何实际工作以执行查询
  • 如何检查这些列是否有索引?
  • SELECT * 也需要这么长时间吗?
  • 正如我所提到的,大桌子上的SELECT COUNT 只需要 0.24 秒。

标签: mysql


【解决方案1】:

如何加快这个 DELETE / LEFT JOIN mysql 查询?

你的三分钟时间似乎很慢。我的猜测是 id 列没有被正确索引。如果您可以提供您正在使用的确切表定义,那将会很有帮助。

我创建了一个简单的 Python 脚本来生成测试数据,并对同一数据集运行多个不同版本的删除查询。这是我的表定义:

drop table if exists a;
create table a
 (id bigint unsigned  not null primary key,
  data varchar(255) not null) engine=InnoDB;

drop table if exists b;
create table b like a;

然后我将 100k 行插入到 a 中,将 25k 行插入到 b 中(其中 22.5k 也在 a 中)。这是各种删除命令的结果。顺便说一下,我在运行之间删除并重新填充了表格。

mysql> DELETE FROM a WHERE EXISTS (SELECT b.id FROM b WHERE a.id=b.id);
Query OK, 22500 rows affected (1.14 sec)

mysql> DELETE FROM a USING a LEFT JOIN b ON a.id=b.id WHERE b.id IS NOT NULL;
Query OK, 22500 rows affected (0.81 sec)

mysql> DELETE a FROM a INNER JOIN b on a.id=b.id;
Query OK, 22500 rows affected (0.97 sec)

mysql> DELETE QUICK a.* FROM a,b WHERE a.id=b.id;
Query OK, 22500 rows affected (0.81 sec)

所有测试均在配备 Ubuntu 8.10 和 MySQL 5.0 的 Intel Core2 四核 2.5GHz、2GB RAM 上运行。注意,一条sql语句的执行还是单线程的。

【讨论】:

  • 请查看更新后的问题。看起来实际的命令更复杂,因为“SHOW PROCESSLIST”可能只显示查询的一部分。索引列似乎也无济于事......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2015-02-22
  • 2012-09-05
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2018-07-10
相关资源
最近更新 更多