2010-06-28 77 views
0

我試圖優化一個很老的查詢,我無法將我的頭包裹起來。我想歸檔的結果是,我想向網上商店推薦其他客戶表示有興趣的訪問者,即他們還與訪問者正在查看的產品一起購買了什麼。查詢客戶已與列出的產品一起購買的商品

我有一個子查詢,但它的慢,需要~8萬行約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我得到了fllowing。請注意,我沒有表上的任何索引(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         | 
+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+ 
+0

你對wsBasket表有什麼索引?當你對查詢執行EXPLAIN時會得到什麼? – 2010-06-28 11:03:15

+0

你的索引是什麼樣的?知道這可能會幫助您更輕鬆地修改查詢。 – MJB 2010-06-28 11:04:26

回答

1

兩個明顯的指標增加:一個在basketid和第二對產品編號:然後重新進行查詢和新的EXPLAIN地看到,指數正在使用

+0

做了詭計,現在查詢〜0.124!:)我正在研究組合索引並修改查詢,好吧。謝謝!有什麼辦法可以避免子查詢? – johan 2010-06-28 11:15:22

+0

組合/複合索引可能對這個表的其他查詢有用,但只有你知道其他類型的查詢是否被執行,所以我們不能幫助沒有進一步的信息......但我懷疑這兩個簡單的索引將有助於應用程序代碼的其他區域 – 2010-06-28 11:22:02

+0

請參閱bobince對修改查詢 – 2010-06-28 11:44:43

0

你主要用於搜索兩個領域在這個查詢中是productid和basketid。

當您搜索productid等於427的記錄時,數據庫不知道該在哪裏查找此記錄。它甚至不知道,如果它找到一個匹配的,就不會有另一個匹配的,所以它必須查看整個表,可能有數千個記錄。

索引是一個單獨的文件,它被排序,並且只包含您想要排序的字段。所以創建一個索引節省了大量的時間!

1

除了確保productidbasketid上存在合適的索引,您通常可以將查詢構造爲簡單聯接而非子查詢,特別是在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 

對於我來說,在可能相似的數據集,連接導致了EXPLAIN輸出的兩個select_type: SIMPLE行,而子查詢方法吐出一個可怕的按績效DEPENDENT SUBQUERY。因此,聯接的速度要快上一個數量級。

+0

+1的連接查詢的響應 – 2010-06-28 11:30:24

相關問題