使用内部联接和子查询后,缓慢的MYSQL查询

时间:2014-03-08 17:05:37

标签: mysql subquery opencart

我花了好几个小时试图让我的查询运行得更快,到目前为止它适用于我的数据库 但是返回结果需要43秒。基本上连接了两个表,我只需要为每个 order_id 返回最新的 order_history_id ,其中 order_status 为12。

我已经尝试过使用表格快捷方式,即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)

2 个答案:

答案 0 :(得分:0)

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

更新:在查看了表格之后,我意识到oc_order_history.commentText列,因此搜索此列的速度会非常慢。如果您尝试删除条件(就像我一样),我相信您的查询会更快。如果您必须查询注释列,请尝试将其更改为VARCHAR或放置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)

答案 1 :(得分:0)

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

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

name LIKE 'Pet%'

将匹配Pete,Peter,Petra,Petronela,Petriarca,Peter Pan等名称的所有行...如果您想搜索确切的值,请与比较符号=进行比较,{{1 },<><=,例如

>=

现在也考虑这个问题:

name = 'Peter'