[英]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.