簡體   English   中英

查詢客戶與所列產品一起購買的產品

[英]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以查看正在使用的索引

除了確保在productidbasketid上存在合適的索引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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM