查询减慢网站速度,必须使它们执行得更快

Posted

技术标签:

【中文标题】查询减慢网站速度,必须使它们执行得更快【英文标题】:Queries slow down website and must make them execute faster 【发布时间】:2018-04-06 11:32:46 【问题描述】:

我在 wordpress 中有 2 个查询显着降低了我的网站速度。第一个是

   global $wpdb;
    $tbl = $wpdb->prefix . "my_tournament_matches_events";  
    $result = $wpdb->get_var("SELECT count(*) FROM $tbl WHERE match_id = '$match' AND player_id = '$player' AND event_id = 'app'");
    if($result)  return 'checked="checked"'; 

问题在于,它会检查每个玩家(0.33 秒)是否参加了比赛,这意味着每支球队有 20 次查询(6.6 秒,两支球队 = 13.2 秒)。我想知道我是否可以只用两个查询(每个团队一个)。

第二个查询是

    $output.="<td colspan='2'>".my_fetch_data_from_id($homeplayer->player_id,'data_value')."</td>";
    foreach($events as $event)
        $evcount = $wpdb->get_results("SELECT count(*) as total_events 
                                       FROM $table2 
                                       WHERE match_id='$mid' 
                                       AND player_id='$homeplayer->player_id' 
                                       AND event_id='$event->id'" );
        $total= $evcount[0]->total_events;

        $output.="<td><input type='text' name=hm-$homeplayer->player_id-$event->id value='$total'/></td>";
     

在第二个查询中,它检查每个玩家,但由于我有大约 11 个事件可用,这意味着它执行 11events*20players*2teams=440 个查询。是否可以更改代码以减少查询的数量和时间?第二次查询的平均时间约为 0.3 秒,因此每次改进都会很明显

【问题讨论】:

对于第一个查询,您可以将限制设置为 1,这意味着如果找到结果,它将立即停止 您好,您应该首先在 SQL 查询中转义您的变量(例如 $match)。 避免使用*,改用列名。 这里的完整场景是什么?玩家是否登录游戏?你如何识别玩家“在游戏中”? 如果我先有玩家在游戏中,请选择他参加。然后查询添加到基础一个名为 app 的事件,而其他列将是玩家 id、匹配 id 【参考方案1】:

总结一下:

LIMIT 1 添加到查询中,这将确保查询找到结果时不会继续寻找其他结果; 避免在count 中使用*,而只依靠必填字段; 尽可能为列添加索引;

为了可读性、一致性和一些错误,您可以更改单引号和双引号:

$output.='<td colspan="2">'.my_fetch_data_from_id( $homeplayer->player_id, 'data_value' ).'</td>';
$output.='<td><input type="text" name="hm-'.$homeplayer->player_id-$event->id.'"value="'.$total.'"/></td>';
              // Seems odd here otherwise ^

【讨论】:

【参考方案2】:

我建议在数据库中添加两个索引。 (以及检查它们是否存在)

ALTER TABLE my_tournament_matches_events 
    ADD INDEX index1 (`player_id`, `match_id`, `event_id`);

ALTER TABLE total_events 
    ADD INDEX index2 (`player_id`, `match_id`, `event_id`);

这应该会大大加快速度。 0.33s 是一个很慢的查询响应时间。

【讨论】:

你怎么知道他们目前有哪些索引? 如果查询执行这么长时间,很可能至少有一个表没有被索引 当然是“可能的”,但这仍然是一个猜测,请先在评论中提问,然后再回答。你在一张你根本不知道的表上提供alter table 命令 这就是为什么我建议首先检查索引是否存在。 我们没有索引,因为表中的数据经常被移动到另一个数据库中,这不可能起到同样的作用

以上是关于查询减慢网站速度,必须使它们执行得更快的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB,即使它们形成分区,查询字段也会减慢查询速度吗?

SQL 更新查询

ORDER BY 子句是不是会减慢查询速度?

在某些情况下,为什么CTE(公用表表达式)与SQL Server中的临时表相比会减慢查询速度

如何在不减慢执行速度的情况下分析 Android 应用程序的执行?

如何使自己的网页打开更快?