1

以下を単一のクエリに最適化することは可能ですか?

ここでは、一時テーブルを使用した複数のクエリよりも単一のクエリの方が効率的であると想定しているため、私の仮定が間違っている場合はお知らせください。

$id現在のメンバー ID です。$list最終結果から削除される itemid のリストです (例: 既にダウンロードされたアイテム)。

このクエリの目的は、メンバーと同様のアイテムをダウンロードした上位 500 人のメンバーを見つけること$idです。次に、これらのメンバーがダウンロードしたすべてのアイテムを検索し、各メンバーからの同様のダウンロード数と各アイテムの合計ダウンロード数に基づくスコアでランク付けします。したがって、最終的な結果は、$idメンバーへの推奨事項のリストになります。

クエリは次のとおりです。

mysql_query('CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY AS
(SELECT a.memberid, COUNT(*) `score` FROM table_downloads a INNER JOIN
(SELECT itemid FROM table_downloads WHERE memberid='.$id.') b ON a.itemid = b.itemid
WHERE a.memberid!='.$id.' GROUP BY a.memberid HAVING score>0 ORDER BY score DESC LIMIT 500)');

$res=mysql_query('SELECT table_downloads.itemid,COUNT(table_downloads.itemid*temp1.score) AS score2
FROM table_downloads,temp1
WHERE table_downloads.memberid=temp1.memberid AND table_downloads.itemid NOT IN ('.$list.') 
GROUP BY table_downloads.itemid
ORDER BY score2 DESC LIMIT 30');

mysql_query('DROP TABLE temp1');

数百万行ある場合、このクエリは使用できなくなるほど時間がかかる可能性があります。迅速に実行されるようにするためのアドバイスも大歓迎です。

* mysql_query を意図的に使用しています。mysqli を使用するように言わないでください。*

4

2 に答える 2

1
  1. することはできませんmysql_query()
  2. この場合、3 つの呼び出しを 1 つに結合することで何かが顕著に節約されると考えるのは間違いです。

明確にするために、それは非常に一般的な妄想です.1つの厄介なクエリが複数のクエリよりも速く実行されると考えるのです。そうではありません。

于 2013-04-10T11:24:04.113 に答える
0

興味本位で芝居をしました。

かなりではありませんが、可能だと思います。現在のスクリプトよりも遅いと思います。

SELECT table_downloads.itemid, COUNT(table_downloads.itemid * temp1.score) AS score2
FROM table_downloads
INNER JOIN (SELECT a.memberid, COUNT(*) `score` 
            FROM table_downloads a 
            INNER JOIN table_downloads b
            ON  a.itemid = b.itemid AND b.memberid='.$id.' AND a.memberid=b.memberid
            GROUP BY a.memberid 
            ORDER BY score DESC
            LIMIT 500) temp1
ON table_downloads.memberid = temp1.memberid 
WHERE table_downloads.itemid NOT IN ('.$list.') 
GROUP BY table_downloads.itemid
ORDER BY score2 DESC 
LIMIT 30

ただし、実際にはテストされていません(テーブルレイアウトがわからない)

于 2013-04-10T12:57:18.853 に答える