我正在尝试优化一个我无法理解的非常古老的查询。我想要归档的结果是,我想在网上商店向访问者推荐其他客户感兴趣的东西,即他们与访问者正在查看的产品一起购买的其他东西。
我有一个子查询,但它很慢,在 ~8 000 000 行上需要 ~15 秒。
布局是,放入用户篮子的所有产品都保存在一个表中wsBasket
,并由一个分隔basketid
(在另一个表中与一个成员相关联)。
在此示例中,我想列出用户购买的所有最受欢迎的产品以及 productid 427,但不列出 productid 427 本身。
SELECT productid, SUM(quantity) AS qty
FROM wsBasket
WHERE basketid IN
(SELECT basketid
FROM wsBasket
WHERE productid=427) AND productid!=427
GROUP by productid
ORDER BY qty
DESC LIMIT 0,4;
任何帮助深表感谢!希望这对至少某人有任何意义:)
更新1: 感谢您的评论,这里是我的答案,他们不适合评论字段。
在上面的查询中使用 EXPLAIN 我得到了结果。请注意,我在表上没有任何索引(id
-field 上的主键除外),我想修改查询以从索引中受益并将索引放在正确的键上。
+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+
| 1 | PRIMARY | wsBasket | ALL | NULL | NULL | NULL | NULL | 2821 | Using where; Using temporary; Using filesort |
| 2 | DEPENDENT SUBQUERY | wsBasket | ALL | NULL | NULL | NULL | NULL | 2821 | Using where |
+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+