繁体   English   中英

使用内部联接和子查询后,MYSQL查询速度变慢

[英]Slow MYSQL query after using inner join and sub query

我花了几个小时试图使查询运行得更快,到目前为止它在我的数据库上仍然有效。
但是需要43秒才能返回我的结果。 基本上有两个表联接在一起 ,我只需要为order_status为12的每个order_id返回最新的order_history_id

我尝试使用表快捷方式,即T1 T2等,但为了简单起见,我的sql查询在以下任何帮助下均具有相关的表名,不胜感激

SELECT oc_order.order_id, oc_order.firstname, oc_order.lastname
   FROM oc_order 
      INNER JOIN oc_order_history ON oc_order.order_id = oc_order_history.order_id
         AND oc_order_history.comment NOT LIKE '' 
         AND oc_order_history.order_status_id LIKE '12'   
         AND order_history_id = (SELECT max(order_history_id) 
                                  FROM   oc_order_history i 
                                  WHERE  i.order_id = oc_order.order_id)

如果不想在字段内搜索文本,请不要使用LIKE 另外,请勿将WHERE条件放入JOIN条件。 此外,请检查要加入和过滤的字段中是否有SQL索引

更新:查看表之后,我意识到oc_order_history.comment是一个Text列,因此在此列上的搜索将非常缓慢。 如果您尝试删除条件(像我一样),我相信您的查询将会更快。 如果必须查询注释列,请尝试将其更改为VARCHAR或put and index

另外,您应该至少在oc_order_history(order_status_id)oc_order_history(order_id)具有索引

SELECT oc_order.order_id, oc_order.firstname, oc_order.lastname
FROM oc_order 
INNER JOIN oc_order_history ON oc_order.order_id = oc_order_history.order_id
WHERE oc_order_history.order_status_id = 12   
  AND order_history_id = (SELECT MAX(order_history_id) 
                          FROM oc_order_history i 
                          WHERE i.order_id = oc_order.order_id)

INNER JOIN增加了另一个过滤条件,因此占用了更多资源,即它实际上是LEFT JOIN + WHERE {joining column} IS NOT NULL 在参与联接和/或where子句(特别是使用LIKE搜索的字符串值)的列上建立索引将有助于最小化资源成本。

在您的查询中,您在WHERE子句中使用LIKE ,但是完全错误,因此我可以说您在滥用它。 当您需要搜索字符串但只知道字符串的一部分时,使用LIKE

name LIKE 'Pet%'

将匹配所有具有Pete,Peter,Petra,Petronela,Petriarca,Peter Pan等名称的行。如果要搜索精确值,请与比较符=<><=>= ,例如

name = 'Peter'

现在还要考虑以下查询:

SELECT o.order_id, o.firstname, o.lastname
FROM oc_order o
LEFT JOIN oc_order_history oh USING(order_id)
WHERE oh.order_status_id = 12   
    AND oh.order_history_id IN (
        SELECT MAX(order_history_id) 
        FROM oc_order_history
        GROUP BY order_history_id
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM