【问题标题】:Why is this MySQL query so slow or even blocking further execution?为什么这个 MySQL 查询如此缓慢甚至阻止进一步执行?
【发布时间】:2021-10-31 23:33:16
【问题描述】:

我有一个简单的 MySQL 查询,在我使用条件语句之前,我在引用另一个模式的表的视图上执行一次 LEFT JOIN,搜索每个表的一列(一个虚拟)。

SELECT  *
    FROM  table_a a
    LEFT JOIN  virtual_table_b b  ON a.id = b.id
    WHERE  a.text LIKE '%somestring%'
      OR  b.text LIKE '%somestring%';

somestring 相当短甚至阻止整个架构正常使用时,它的工作速度非常慢。 (我猜由于繁重的处理而暂停它,数据库的其余部分仍在工作)。

这些语句本身运行良好!

SELECT * FROM table_a a LEFT JOIN virtual_table_b b on a.id = b.id;

加入似乎很好 -> 大约需要 0.04 秒。

SELECT * FROM table_a a WHERE a.text LIKE '%somestring%';
SELECT * FROM virtual_table_b b WHERE b.text LIKE '%somestring%';

字符串匹配似乎也很好 -> 每个大约需要 0.04 秒。

我的猜测是,由于它是左连接,virtual_table_b 中的许多值都是 NULL,这需要大量计算时间?

两个表都有大约 40 000 个条目,其中的文本有时超过 60 000 个字符。

我正在使用 InnoDB 版本 5.7.22。

组合查询如此缓慢的可能原因是什么,我该如何改进?

【问题讨论】:

  • 请提供SHOW CREATE TABLEEXPLAIN SELECT ...

标签: mysql sql query-optimization database-performance


【解决方案1】:

试试

    SELECT * 
    FROM table_a a 
    LEFT JOIN virtual_table_b b on a.id = b.id 
    WHERE a.text LIKE '%somestring%'
UNION 
    SELECT * 
    FROM table_a a 
    INNER JOIN virtual_table_b b on a.id = b.id 
    WHERE b.text LIKE '%somestring%';

【讨论】:

    【解决方案2】:

    OUTER JOIN 上包含WHERE 子句可能会有问题。试试:

    SELECT  *
        FROM  table_a a
        LEFT JOIN  virtual_table_b b  ON a.id = b.id
          AND  b.text LIKE '%somestring%'
        WHERE  a.text LIKE '%somestring%'
          OR  b.text is not null;
    

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2019-01-28
      • 1970-01-01
      • 2020-04-23
      • 2013-07-09
      相关资源
      最近更新 更多