在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);
(以及其他列的类似命令)向表中添加索引,但似乎它对时间消耗没有影响。我在这里做错了吗?答案 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语句的执行仍然是单线程的。