2

私は使っている

SELECT * 
  FROM picture 
 INNER JOIN user ON picture.fbid = user.fbid 
 WHERE hide = 0 
   AND userhide = 0 
 ORDER BY gender, RAND( ) LIMIT 0 , 1

これが実行され、性別が女性であるランダムな行の写真へのリンクが表示されます。実行には約 15 秒かかります。

高速に計算されるように SQL を変更するにはどうすればよいですか? 両方のテーブルを組み合わせてランダ​​ムな行を取得しないように、Picture テーブルに性別列を追加する必要がありますか、または SQL を最適化する他の方法がありますか?

4

2 に答える 2

3

[編集] MySQL ストアド プロシージャでも同じことができます。ここでコーディングしました: http://sqlfiddle.com/#!2/d0e6a/2

(注:すべてのクエリでカウントを行わないと負荷が軽減されます。そうしないと、この特定のケースではさらに遅くなる可能性があり、クエリを保持することをお勧めしますが、インデックスの最適化を行います。または、これを確認してください:クロステーブルインデックスです可能ですか?

[編集 2]各テーブルで平均 50000 のランダム エントリを使用したインデックス最適化の別の例を次に示します: http://sqlfiddle.com/#!2/bfbe1/1数分してもまだ結果はありません!)。CREATE INDEXを使用して、既存のテーブルにインデックスを作成できます。

PHPスクリプトから2つのクエリを使用した私のソリューションは次のとおりです。

$sql="SELECT COUNT(*) 
  FROM picture 
 INNER JOIN user ON picture.fbid = user.fbid 
 WHERE hide = 0 
   AND userhide = 0
   AND gender = 'female' 
   GROUP BY gender";

$result=mysql_query($sql);
$row=mysql_fetch_array($result);

$sql="SELECT * 
      FROM picture 
      INNER JOIN user ON picture.fbid = user.fbid 
      WHERE hide = 0 
      AND userhide = 0
      AND gender = 'female' 
      LIMIT FLOOR(RAND()*$row['COUNT(*)']),1";

$result=mysql_query($sql);
$picture=mysql_fetch_array($result);

これにより、クエリがはるかに高速になります。

また、テーブルが大きい場合 (クエリに 15 秒かかるため、これが当てはまると思います)、条件付き/結合フィールドにインデックスが付けられていると役立ちます。

于 2012-08-26T10:35:53.850 に答える
2

picture.fbid = user.fbidこれについて INDEX を作成することをお勧めしJOINます。

Mysql 固有の詳細情報: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

于 2012-08-26T14:56:37.440 に答える