[英]Is there a query which select which customers have bought a specific product and what other products did these same customers buy?
[英]query for what customers have bought together with the listed product
我正在嘗試優化一個我無法解決的非常老的查詢。 我要存檔的結果是,我想在網上商店中推薦訪問者,其他客戶表現出了什么興趣,即他們與訪問者正在查看的產品一起購買了什么。
我有一個子查詢,但是它很慢,在〜8 000 000行上花費〜15s。
布局是被放在一個用戶籃的所有產品都保存在一個表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 |
+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+
要添加兩個明顯的索引:一個在basketid上,另一個在productid上:然后重試查詢和一個新的EXPLAIN以查看正在使用的索引
除了確保在productid
和basketid
上存在合適的索引basketid
,您還將經常從將查詢結構化為簡單basketid
而不是子查詢中受益,尤其是在MySQL中。
SELECT b1.productid, SUM(b1.quantity) AS qty
FROM wsBasket AS b0
JOIN wsBasket AS b1 ON b1.basketid=b0.basketid
WHERE b0.productid=427 AND b1.productid<>427
GROUP BY b1.productid
ORDER BY qty DESC
LIMIT 4
對我來說,在一個可能相似的數據集上, select_type: SIMPLE
導致兩個select_type: SIMPLE
EXPLAIN
輸出中的select_type: SIMPLE
行,而子查詢方法吐出了一個性能糟糕的DEPENDENT SUBQUERY
。 因此,連接速度快了一個數量級。
您在此查詢中主要用於搜索的兩個字段是productid和basketid。
當您搜索productid等於427的記錄時,數據庫不知道在哪里可以找到該記錄。 它甚至不知道是否找到了一個匹配項,就不會再有另一個匹配項,因此它必須瀏覽整個表,可能要查找數千條記錄。
索引是一個單獨的文件,已排序,並且僅包含您要對其進行排序的字段。 因此創建索引可以節省大量時間!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.