2

写真コンテンツのウェブページを構築しています。コンテンツのすべての組み合わせを作成するために、クロス ジョインを使用します。次の単純なテーブルがあるとします。

テーブル写真

id filename
------------
1   a.jpg
2   b.jpg
3   c.jpg
4   d.jpg
5   e.jpg

テーブルから作ることができる組み合わせの数は 10 で、それらは

1,2
1,3
1,4
1,5
2,3
2,4
2,5
3,4
3,5
4,5

次のクロス結合クエリを使用して上記の結果を取得します

    SELECT cp1.id,
           cp2.id 
      from photos as cp1 
cross join photos as cp2 
     where cp1.id < cp2.id

...そして、次のクエリを使用して、ユーザーが見ていない課題を表示します。

    SELECT cp1.id,
           cp1.filename,
           cp2.id, 
           cp2.filename 
      from challenge_photos as cp1 
cross join challenge_photos as cp2 
     where cp1.id < cp2.id 
       and (cp1.id,cp2.id) not in ( (x1,x2), (x1,x2) ) 
       and cp1.id = something 
       and cp2.img_id != something

これまでのところ、これらのクエリは問題なく機能しています。各クエリは、phpmyadmin から (2300 行から) 約 0.0002 秒かかります。

テーブルに 2000 行あるとします。可能な組み合わせの数は膨大です。Web サイトに多くのアクティブ ユーザーがいる場合、問題が発生する可能性はありますか?

4

2 に答える 2

3

さまざまなサイズのテスト データベースを作成し、クエリをテストしてパフォーマンスを確認することをお勧めします。29k 行のテーブルで同様のクエリを実行すると、10 ~ 30 ミリ秒のクエリと、70k 行のテーブルで同様の数値が得られました。これは、クエリが完全にひどいものではないことを示しているように見える場合があります。クエリもキャッシュされているように見えます。つまり、テーブルへの書き込みがほとんどなく、同じクエリが多数見られる場合、大きなメリットが得られます。

例のクエリには重大な非対称性もあります。cp1.id が小さい場合は数百/1000 の行が取得されますが、大きい場合は数行しか取得されません。

この SO の質問は、内部結合のように機能する WHERE 句を使用したクロス結合クエリを参照しています。

于 2011-03-23T01:32:34.600 に答える
0

2000年では、そうではないかもしれません。20万枚の写真で、おそらくそうです。

別の方法は次のとおりです。

  1. (cp1、cp2)でチャレンジテーブルを構築します。
  2. 新しい写真が挿入されたときに、ルールに従って、前の表に新しい課題が追加されるトリガーを作成します
  3. その場合、クエリは (内側) Challenge と (2 倍の) ChallengePhoto テーブルに参加します。

テーブルに適切なインデックスがあれば、クエリに問題はありません。(クエリによってもたらされるチャレンジの数に) 制限を設けることも、パフォーマンスに役立ちます。

于 2011-03-23T01:19:50.957 に答える