我根本不是mysql
专家,但我需要弄清楚以下查询的缓慢程度:
DELETE m,i from Table1 AS m
LEFT JOIN
Table2 AS i
ON m.id = i.id
WHERE m.state='in'
Table1
包含600个条目(SELECT COUNT(*) from Table1
耗时约0.00秒)和202个条目Table2
(SELECT COUNT(*) from Table2
耗时约0.00秒)。但是,上述JOIN DELETE
查询大约需要0.77秒。
有没有办法在不更改表定义的情况下加快此DELETE
查询?
我试图指出'通过在DELETE
查询之前应用以下三个查询来讨论相关列:
alter table Table1 add index(id);
alter table Table1 add index(state);
alter table Table2 add index(id);
但上面的JOIN DELETE
查询仍然需要大约相同的时间!因此,索引列似乎对效果没有任何影响。
这个查询真的这么慢吗?我能做些什么来改善它?
其他信息:
查询
explain select * from Table1 AS m
LEFT JOIN
Table2 AS i
ON m.id = i.id
WHERE m.state='in'
产生以下输出:
+----+-------------+-------+------+-----------------------------------------------+-----------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+-----------------------------------------------+-----------+---------+-------+------+-------------+
| 1 | SIMPLE | m | ref | state,state_2,state_3,state_4 | state | 1 | const | 1 | Using where |
| 1 | SIMPLE | i | ALL | id,id_2,id_3 | NULL | NULL | NULL | 2 | |
+----+-------------+-------+------+-----------------------------------------------+-----------+---------+-------+------+-------------+
答案 0 :(得分:0)
我试图复制你正在做的事情我的代码在下面
delete t1, t2 FROM sandbox.t1 t1
left join sandbox.t2 t2 on
t2.id = t1.id
where
t1.state = 'a';
这在不到一秒的时间内运行。我建议删除任何索引,因为你几乎没有任何数据(不是它应该有所作为),只是为了消除问题。如果您使用的是mysql工作台,则需要右键单击表并更改它。否则google drop index找到如何删除索引。
我唯一能想到的就是减慢速度,这就是锁定你的表格,你的查询正在等待它完成。你需要杀掉那个你也可以通过mysql workbench做的过程。你也可以重新启动你的mysql ...我不知道你的设置,所以有点难以告诉你如何解决这个问题。
答案 1 :(得分:0)
删除将比同等的select
语句慢,因为delete
正在做更多工作。特别是,每行都会在删除时记录。然后修改任何索引。
我首先看一下基本查询的性能:
select *
from Table1 AS m LEFT JOIN
Table2 AS i
ON m.id = i.id
WHERE m.state = 'in';
最佳索引是Table1(state, id)
和Table(id)
。我希望delete
比select
慢一个数量级。