我有这个脚本来获取帖子:
$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文件非常大。什么导致服务器冻结?如何优化上述查询?
答案 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
以查看它是否有帮助。