【发布时间】:2014-04-02 05:46:05
【问题描述】:
我根本不是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 秒)和 Table2 共 202 个条目(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 | |
+----+-------------+-------+------+-----------------------------------------------+-----------+---------+-------+------+-------------+
【问题讨论】:
-
第一个索引在技术上是不必要的;也许与我们分享
EXPLAIN <your query>;的输出会有所帮助。你用的是什么引擎? -
EXPLAIN <your query>;到底是什么意思?使用它确实给了我一个SQL syntax error。不知道mysql很好... -
查看here如何使用
EXPLAIN。 -
所以我想我用对了。除了它只能用在 select 语句上,不能用在 delete 上。无论如何,我无法为您提供您希望看到的信息。
-
请注意,除了排除连接外,像这样的查询中的外连接非常罕见,而且有点荒谬。
标签: mysql performance