我花了好几个小时试图让我的查询运行得更快,到目前为止它适用于我的数据库 但是返回结果需要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)
答案 0 :(得分:0)
如果您不想搜索字段内的文本,请不要使用LIKE
。
此外,不要将WHERE
条件置于JOIN
条件中。
此外,请检查您要加入和过滤的字段中是否有 SQL索引。
更新:在查看了表格之后,我意识到oc_order_history.comment
是Text
列,因此搜索此列的速度会非常慢。如果您尝试删除条件(就像我一样),我相信您的查询会更快。如果您必须查询注释列,请尝试将其更改为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'