【发布时间】:2010-06-28 10:58:53
【问题描述】:
我正在尝试优化一个我无法理解的非常古老的查询。我要归档的结果是,我想在网上商店向访问者推荐其他客户感兴趣的东西,即他们与访问者正在查看的产品一起购买的其他产品。
我有一个子查询,但它非常很慢,大约需要 15 秒处理大约 8 000 000 行。
布局是所有放入用户购物篮的产品都保存在表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: 感谢你们的 cmets 伙计们,这是我的答案,他们不适合 cmets-field。
在上面的查询中使用 EXPLAIN,我得到了结果。请注意,我的表上没有任何索引(id 字段上的主键除外),我想修改查询以从索引中受益并将索引放在正确的键上。
+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+
| 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 |
+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+
【问题讨论】:
-
wsBasket 表上有哪些索引?当您对查询执行 EXPLAIN 时会得到什么?
-
您的索引是什么样的?知道这可能会更容易帮助您修改查询。