[編集] 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 秒かかるため、これが当てはまると思います)、条件付き/結合フィールドにインデックスが付けられていると役立ちます。