优化SQL查询,大型表 - 查询杀死服务器

时间:2011-01-15 06:59:53

标签: php sql optimization

我有这个脚本来获取帖子:

$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文件非常大。什么导致服务器冻结?如何优化上述查询?

3 个答案:

答案 0 :(得分:0)

按rand()排序非常昂贵,所以你可能要考虑在代码中预先做一些类似于id的事情,并要求那些特殊事件。

此外,在查询中使用“EXPLAIN”,看看会发生什么。如果我没有读错,你可能会在那里看到子查询,你不能使用索引(因为它是一个'新'表,所以它没有索引。

最后一点,检查表格的索引(es?)。

答案 1 :(得分:0)

简化 - 您在帖子上的自我加入可能是

加入帖子AS p2 ON posts.id = p2.id AND p2.title!=''(应该是p2.title IS NOT NULL吗?)

答案 2 :(得分:0)

ORDER BY RAND()不会缩放。

mysql-alternatives-to-order-by-rand的答案提供了一种以随机顺序返回行的智能方法。

另外,请尝试在查询结尾处添加LIMIT 100以查看它是否有帮助。