相关产品方法建议,MySQL InnoDB / PHP

时间:2016-10-22 11:05:17

标签: mysql query-optimization innodb

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

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秒秒,它返回与我正在查看的产品一起购买的产品。

至于问题和考虑因素,Percona查询分析器抱怨这两件事,非确定性GROUP BY GROUP BY或ORDER BY在不同的表,这两者都是我需要这样才能获得与相关查询实际相关的顶级项目,但绝对不知道如何解决它,甚至我应该对查询分析器的这个通知感到困扰。

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

请注意,我不是要求提供CI模型/视图/控制器提示,只是提供有关如何优化此查询的提示,和/或有关性能和观看方法的建议......

任何帮助都非常值得赞赏。

1 个答案:

答案 0 :(得分:1)

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,祝你好运。