查询减慢网站速度,必须使它们执行得更快
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,即使它们形成分区,查询字段也会减慢查询速度吗?
在某些情况下,为什么CTE(公用表表达式)与SQL Server中的临时表相比会减慢查询速度