两个单独的查询瞬时。用子查询查询非常慢。为什么? MySQL的/ mariadb的

时间:2018-07-07 18:03:43

标签: mysql sql subquery mariadb

DELETE FROM search WHERE sequence_id IN (34546);
  

受影响的行:0   时间:0.001秒

SELECT sequence_id FROM sequences WHERE sequence_status = 1;
  

好   时间:0.001秒

DELETE FROM search WHERE sequence_id IN (SELECT sequence_id FROM sequences WHERE sequence_status = 1);
  

受影响的行:0   时间:2868秒

我在做什么错了?

EXPLAIN DELETE FROM search WHERE sequence_id IN (SELECT sequence_id FROM sequences WHERE sequence_status = 1);

enter image description here

2 个答案:

答案 0 :(得分:0)

尝试使用联接而不是IN

DELETE search
       FROM search
            INNER JOIN sequences
                       ON sequences.sequence_id = search.sequence_id
       WHERE sequences.sequence_status = 1;

要支持该功能,请在search (sequence_id)sequences (sequence_id, sequence_status)上创建一个索引。

CREATE INDEX search_sequence_id
             ON search
                (sequence_id);

CREATE INDEX sequences_sequence_id_sequence_status
             ON sequences
                (sequence_id,
                 sequence_status);

答案 1 :(得分:0)

    众所周知,
  • IN ( SELECT ... )的优化很差,尤其是在旧版本的MySQL / MariaDB中。避免!
  • 复杂的DELETE / UPDATE曾经有一个la脚的解析器/优化器。我怀疑这就是你打的。较新的版本统一了代码,从而改善了删除/更新的优化。
  • 1ms的时间通常表示查询缓存已接管。 (因此,我不信任您的前两个时间。)
  • sequences有多大?您有INDEX(sequence_status, sequence_id)吗?
  • 尝试使用多表DELETE语法,可以 进行不同的优化。