【问题标题】:Optimizing SQL Query, large table - query kills server优化 SQL Query,大表 - 查询杀死服务器
【发布时间】:2011-08-09 16:58:19
【问题描述】:

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

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

【问题讨论】:

  • 你说先生,我感觉很特别。你检查过表的索引等等吗?您是否试图一次阅读整个表格?另外,ORDER BY RAND() 效率非常低,我强烈建议不要使用它。
  • 凯文您好,那我该如何更改脚本?
  • 我正在编辑和重新标记这个问题,因为它是 95% SQL。考虑删除 PHP 位,因为它们与问题几乎完全无关,并将其作为 SQL 问题呈现。
  • MYSQL中有没有类似Oracle HINTS的东西???通常我们使用 HINT 来优化指定索引和搜索逻辑等的查询。

标签: php sql optimization


【解决方案1】:

通过 rand() 进行排序非常昂贵,因此您可能需要考虑在代码中预先选择 id 之类的操作,然后询问那些特定的。

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

最后一点,检查表的索引。

【讨论】:

    【解决方案2】:

    简化 - 您可以自行加入帖子

    在 posts.id = p2.id AND p2.title != '' 上将帖子作为 p2 加入(应该是 p2.title IS NOT NULL 吗?)

    【讨论】:

      【解决方案3】:

      ORDER BY RAND() 无法缩放。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 2015-06-11
        • 2010-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多