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

时间:2014-03-27 10:21:48

标签: mysql

在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个条目。

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

如何加快此查询?哪些部分很耗时?

其他信息:

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

1 个答案:

答案 0 :(得分: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)

所有测试均在Intel Core2四核2.5GHz,2GB RAM和Ubuntu 8.10以及MySQL 5.0上运行。注意,一个sql语句的执行仍然是单线程的。