mysql - 使用内连接和子查询后 MYSQL 查询变慢

标签 mysql subquery opencart

我花了几个小时试图让我的查询运行得更快,到目前为止它可以在我的数据库上运行。
但是返回我的结果需要 43 秒。基本上两个表是连接在一起的,我只需要为每个 order_id 返回最新的 order_history_idorder_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 搜索的字符串值)将有助于最大限度地降低资源成本。

在您的查询中您正在使用 LIKEWHERE条款但完全错误因此我可以说你滥用它。 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/

相关文章:

Oracle SQL(Plus) ORDER BY - 无效标识符(嵌套子查询)

php - OpenCart - 从产品查询中删除一个类别及其子类别

php - .htaccess 重定向到仅用于主页的子域 (OpenCart)

java - 无法使用 TomCat 将 MySQL Connector/J 与 Servlet 一起使用

mysql - 在 SQL 查询中封装聚合函数

mysql - 多对多关系的文本搜索

sql - 如何使用 BETWEEN 运算符比较两个 SELECT 子查询?

php - 如何在结帐页面中删除送货地址和送货方式-opencart2

php - 为什么我的 .sql 文件末尾有 PHP/HTML 代码?

php - 从 MySQL DB 获取数据后,如何在 php 页面中创建可点击的 url?