【问题标题】:Why does this query take so much time and how to speed it up?为什么这个查询需要这么多时间以及如何加快速度?
【发布时间】: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


【解决方案1】:

我试图复制你正在做的我的代码如下

delete t1, t2 FROM sandbox.t1 t1
left join sandbox.t2 t2 on
    t2.id = t1.id
where
    t1.state = 'a';

这将在不到一秒的时间内运行。我建议删除任何索引,因为您几乎没有任何数据(并不是说它应该有所作为)并且只是为了消除问题。如果您使用的是 mysql 工作台,则需要右键单击您的表并更改它。否则谷歌删除索引以查找如何删除索引。

我能想到的唯一会减慢这一速度的事情是锁定你的表,而你的查询正在等待它完成。您需要终止该进程,您也可以通过 mysql 工作台执行此操作。你也可以重新启动你的mysql ...我不知道你的设置,所以很难告诉你如何去做。

【讨论】:

    【解决方案2】:

    Delete 将比等效的 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 慢一个数量级。

    【讨论】:

    • 感谢您的建议,但这并没有带来任何性能提升。如果不定义不同的表格布局,可能根本无法提高性能?
    • @Alex 。 . .您对delete 性能的期望可能是问题所在。你在这两个表中删除了多少行?
    • 大约 400 行在 2.2 秒内。否则从表中选择 1100 行只需要 0.10 秒。这比原来慢了 60 倍……
    • @Alex 。 . .在此处查看接受的答案:stackoverflow.com/questions/812512/….
    猜你喜欢
    • 2011-08-27
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2011-12-07
    • 2020-02-20
    • 2021-11-27
    相关资源
    最近更新 更多