0

頭を包むことができない非常に古いクエリを最適化しようとしています。アーカイブしたい結果は、他の顧客が興味を示したもの、つまり訪問者が見ている製品と一緒に購入したものをWebショップで訪問者に推奨したいということです。

私はサブクエリを持っていますが、それは非常に遅く、〜8 000000行で〜15秒かかります。

レイアウトでは、ユーザーバスケットに入れられるすべての製品がテーブルに保持さwsBasketれ、basketid(別のテーブルではメンバーに関連付けられている)で区切られます。

この例では、ユーザーがproductid 427と一緒に購入した最も人気のあるすべての製品をリストしますが、productid427自体はリストしません。

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)。インデックスを利用して正しいキーにインデックスを配置するようにクエリを変更したいと思います。

+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+
| 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                                  |
+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+
4

3 に答える 3

1

追加する2つの明らかなインデックス:1つはbasketidに、もう1つはproductidに:クエリと新しいEXPLAINを再試行して、インデックスが使用されていることを確認します

于 2010-06-28T11:11:54.290 に答える
1

とに適切なインデックスが存在することを確認するだけでなく、特にMySQLでは、クエリをサブクエリではなく単純な結合として構造化することでメリットが得られることがよくありますproductidbasketid

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

私の場合、おそらく類似したデータセットでは、結合によって出力に2つのselect_type: SIMPLE行が生成されましたEXPLAINが、サブクエリメソッドはパフォーマンスにとって恐ろしいものを吐き出しましたDEPENDENT SUBQUERY。その結果、結合は1桁以上速くなりました。

于 2010-06-28T11:26:58.200 に答える
0

このクエリで主に検索に使用する2つのフィールドは、productidとbasketidです。

productidが427に等しいレコードを検索する場合、データベースにはこのレコードを見つける手がかりがありません。一致するものが1つ見つかった場合でも、一致するものがもう1つないこともわかりません。そのため、テーブル全体、場合によっては数千のレコードを調べる必要があります。

インデックスは、並べ替えられた別のファイルであり、並べ替えに関心のあるフィールドのみが含まれています。したがって、インデックスを作成すると、時間を大幅に節約できます。

于 2010-06-28T11:19:34.660 に答える