为什么这个查询花了这么多时间以及如何加快速度?

时间:2014-04-02 05:46:05

标签: mysql performance

我根本不是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个条目Table2SELECT 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 |             | 
+----+-------------+-------+------+-----------------------------------------------+-----------+---------+-------+------+-------------+

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)。我希望deleteselect慢一个数量级。