【问题标题】:Related products approach suggestion, MySQL InnoDB/PHP相关产品方法建议,MySQL InnoDB/PHP
【发布时间】:2016-10-22 11:05:16
【问题描述】:

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

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 查询分析器抱怨这两件事,Non-deterministic GROUP BYGROUP BY or ORDER BY on different tables,两者我需要这样才能获得与相关查询实际相关的项目,但绝对不知道如何修复它,或者我什至应该对来自查询分析器的通知感到困扰。

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

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

任何帮助都将不胜感激。

【问题讨论】:

  • 你为什么要双重加入order_items?
  • @krasipenkov 第一个查找订单项目与订单本身之间的关系,第二个查找所选项目与订单中现有项目之间的关系(或者至少这是我的想法)

标签: mysql query-optimization innodb


【解决方案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,祝你好运。

【讨论】:

  • Omg 这个评论系统...无论如何请修复上次 JOIN 时的别名,我认为您的意思是 p.product_id = prd.id...说到大数据,您认为以后我应该将此移至视图方法?
  • 刚刚修复。
  • 我不认为VIEW 不能比等效的SELECT 快。一个视图被转换为一个选择;但有时优化器无法弄清楚,所以它的工作并不完美。
猜你喜欢
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 2016-02-12
相关资源
最近更新 更多