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

标签 mysql query-optimization innodb

我想扩展我的 CodeIgniter 商店的 UI,并提供有关其他人使用当前产品购买的商品的建议(无论是在查看产品时还是在将产品放入购物车时,现在与问题无关)。 我想出了这个查询(订单表包含订单详细信息,而订单项包含通过外键按特定顺序排列的产品,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,这两者我需要这样我才能在顶部获取与相关查询实际相关的项目,但完全不知道如何修复它,或者甚至我应该真的对查询分析器的这个通知感到困扰。

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

请注意,我并不是要求 CI 模型/ View / Controller 提示,只是要求有关如何优化此查询的提示,和/或有关性能和 View 方法的建议...

非常感谢任何帮助。

最佳答案

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

关于mysql - 相关产品方法建议,MySQL InnoDB/PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40191383/

相关文章:

mysql - Apache 钻 - AssertionError : Relational expression

mysql - 如何更新Mysql中的一系列记录

php - 依靠最大的 table

Mysql "Using temporary"但此查询中没有匹配的官方原因

mysql - 有什么改进 MySQL 查询的技巧吗?

mysql - 如何使用 phpMyAdmin 添加指向同一个表的外键?

php - mysql从5.5升级到5.7,MyISAM到InnoDB,LEFT JOIN和NULL问题

mysql - 如何在MySQL中进行组内聚合查询?

mongodb - 针对不同的排序过滤条件应该创建哪些MongoDB索引来提高性能?

Mysql自增复合