相关产品进场建议,MySQL InnoDB/PHP

Related products approach suggestion, MySQL InnoDB/PHP

我想在我的 CodeIgniter 商店上扩展 UI,提供关于其他人用当前产品购买了什么的建议(无论是在查看产品时还是在将产品放入购物车时,现在与问题无关)。 我想出了这个查询(订单 table 包含订单详细信息,而订单项目包含通过外键按特定顺序排列的产品,prd 别名用于产品 table,其中存储了有关产品的所有重要信息). 查询看起来像这样

SELECT
  pr.product_id,
  COUNT(*) AS num,
  prd.*
FROM
  orders AS o
  INNER JOIN order_items AS po ON o.id = po.order_id
  INNER JOIN order_items AS pr ON o.id = pr.order_id
  INNER JOIN products AS prd ON pr.product_id = prd.id
WHERE
  po.product_id = '14211'
  AND pr.product_id <> '14211'
GROUP BY
  pr.product_id
ORDER BY
  num DESC
LIMIT 3

它工作得很好,花花公子,查询时间是 0.030 秒,它 returns 与我当前正在查看的产品一起购买的产品。

至于问题和注意事项,Percona 查询分析器抱怨这两件事,非确定性 GROUP BYGROUP BY 或 ORDER BY 在不同的 tables,这两个都是我需要的,这样我就可以在顶部获得与相关查询实际相关的项目,但绝对不知道如何修复它,甚至我真的应该为此烦恼来自查询分析器的通知。

第二个问题是关于性能的,因为对于这个查询,它使用临时和文件排序,我正在考虑从这个查询中创建一个视图,并使用它而不是在每次打开某些产品时实际执行查询。

请注意,我不是要 CI model/view/controller 提示,只是关于如何优化此查询的提示,and/or 关于性能和获取视图方法的建议...

非常感谢任何帮助。

SELECT  p.num, prd.*
    FROM  
    (
        SELECT  a.product_id, COUNT(*) AS num
            FROM  orders AS o
            INNER JOIN  order_items AS b  ON o.id = b.order_id
            INNER JOIN  order_items AS a  ON o.id = a.order_id
            WHERE  b.product_id = '14211'
              AND  a.product_id <> '14211'
            GROUP BY  a.product_id
            ORDER BY  num DESC
            LIMIT  3 
    ) AS p
    JOIN  products AS prd  ON p.product_id = prd.id
    ORDER BY  p.num DESC

这应该

  • 运行 更快(尤其是随着数据的增长),
  • 投诉避群,
  • 不要夸大计数,
  • 等等

忽略来自不同表的关于 GROUP BYORDER BY 的投诉——这是一个性能问题;你需要它。

至于将其翻译回 CodeIgniter,祝你好运。