我花了几个小时试图让我的查询运行得更快,到目前为止它可以在我的数据库上运行。
但是返回我的结果需要 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)
最佳答案
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 等的所有行...如果您想搜索精确值,请与比较符号 =
进行比较, <>
, <=
, >=
,例如
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
)
关于mysql - 使用内连接和子查询后 MYSQL 查询变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22272346/