2011-01-15 19 views
0

私が記事を取得するには、このスクリプトを持っているを殺す:の最適化SQLクエリ、大きなテーブル - クエリは、サーバー

$totalrows = 60; 

$sql = "SELECT 
posts.Tags as tags, 
posts.OwnerUserId as postsid, 
posts.Id as postid, 
posts.Body as body, 
posts.Title as title, 
users.Id as userid, 
users.DisplayName as usersname 
FROM posts 
JOIN users ON posts.OwnerUserId = users.Id 
JOIN (select posts.id from posts where posts.title != '' order by rand() asc limit " . $totalrows .") AS tmp_result 
ON (posts.Id = tmp_result.Id)"; 


$r = mysql_query($sql) or die(mysql_error()); 

問題は、サーバーが凍結され、再起動が必要である、MySQLのファイルが非常に大きいです。何が原因でサーバーがフリーズするのですか?上記のクエリを最適化するために何ができますか?

+1

私はあなたが先生と言えば特別な気分です。あなたはテーブルのインデックスなどをチェックしましたか?一度にテーブル全体を読もうとしていますか?また、ORDER BY RAND()は非常に効率が悪く、使用しないことを強くお勧めします。 –

+0

こんにちはKevin、どうすればスクリプトを変更できますか? – Dan

+0

これは95%のSQLなので、私はこの質問を編集し、再タグ付けしています。 PHPのビットを削除することを検討してください。ほとんどの質問とは無関係なので、代わりにSQLの質問として提示してください。 –

答えて

0

rand()は本当に高価ですので、あらかじめコード内でidをpickintしておき、その特定のものを求めておくとよいでしょう。

さらに、クエリに「EXPLAIN」を使用して、何が起こるかを確認します。私がこの誤りを読んでいないのであれば、そこにサブクエリがあり、そのインデックスを使用することはできません(新しいテーブルなので、インデックスはありません)。

最後の点として

、インデックス(ES?)あなたのテーブルのを確認し

0

簡素化 - 。あなたの投稿に自己の参加は

はposts.id = p2.id ON P2とP2との記事を登録しようすることができ.TITLE!= ''(つまりp2.titleでなければなりませんNULLではない?)RAND(BY

0

ORDER)はスケールしない。

mysql-alternatives-to-order-by-randへの答えは、ランダムな順序で行を返すスマートな方法を提供します。

また、質問の最後にLIMIT 100を追加して、役立つかどうかを確認してください。