在同一个MySQL数据库上的相同查询需要花费不同的时间来执行

问题描述 投票:0回答:2

我有一个PhpBB板,拥有约3000个用户和500.000个帖子。在最后几天,我注意到某些主题的打开时间比标准时间长(大约2秒而不是0.05秒)。因此,我进行了调试以进行调查,发现这是查询错误。这是同一条查询,执行时间会有所不同,具体取决于它要请求的主题。例如,此查询需要1.7011秒才能执行:

SELECT u.username, u.user_id, u.user_active, u.user_mask, u.user_color, u.user_first_name, u.user_last_name, u.user_posts, u.user_from, u.user_long, u.user_lat, u.user_from_flag, u.user_website, u.user_email, u.user_aim, u.user_facebook, u.user_flickr, u.user_googleplus, u.user_icq, u.user_jabber, u.user_linkedin, u.user_msnm, u.user_skype, u.user_twitter, u.user_yim, u.user_youtube, u.user_regdate, u.user_allow_viewemail, u.user_rank, u.user_rank2, u.user_rank3, u.user_rank4, u.user_rank5, u.user_sig, u.user_avatar, u.user_avatar_type, u.user_allowavatar, u.user_allowsmile, u.user_allow_viewonline, u.user_session_time, u.user_warnings, u.user_level, u.user_birthday, u.user_next_birthday_greeting, u.user_gender, u.user_personal_pics_count, u.user_style, u.user_lang, u.preferenza_meteo, u.stazione_meteo, u.ct_miserable_user, p.*, t.topic_poster, t.title_compl_infos
FROM phpbb_posts p, phpbb_users u, phpbb_topics t
WHERE p.topic_id = 17278
AND t.topic_id = p.topic_id
AND u.user_id = p.poster_id
ORDER BY p.post_time ASC
LIMIT 0, 15

这是EXPLAIN结果:enter image description here

此查询是相同的,但是它在WHERE子句中使用不同的ID主题,耗时0.0015秒,这是此类数据库请求的正常时间。

SELECT u.username, u.user_id, u.user_active, u.user_mask, u.user_color, u.user_first_name, u.user_last_name, u.user_posts, u.user_from, u.user_long, u.user_lat, u.user_from_flag, u.user_website, u.user_email, u.user_aim, u.user_facebook, u.user_flickr, u.user_googleplus, u.user_icq, u.user_jabber, u.user_linkedin, u.user_msnm, u.user_skype, u.user_twitter, u.user_yim, u.user_youtube, u.user_regdate, u.user_allow_viewemail, u.user_rank, u.user_rank2, u.user_rank3, u.user_rank4, u.user_rank5, u.user_sig, u.user_avatar, u.user_avatar_type, u.user_allowavatar, u.user_allowsmile, u.user_allow_viewonline, u.user_session_time, u.user_warnings, u.user_level, u.user_birthday, u.user_next_birthday_greeting, u.user_gender, u.user_personal_pics_count, u.user_style, u.user_lang, u.preferenza_meteo, u.stazione_meteo, u.ct_miserable_user, p.*, t.topic_poster, t.title_compl_infos
FROM phpbb_posts p, phpbb_users u, phpbb_topics t
WHERE p.topic_id = 17250
AND t.topic_id = p.topic_id
AND u.user_id = p.poster_id
ORDER BY p.post_time ASC
LIMIT 0, 15

这是此查询的EXPLAIN结果:enter image description here

我从大约15年以来一直使用此板,而且我从未注意到类似的问题和类似的时间来讨论一个话题。但是我不明白问题可能在哪里。

php mysql forum phpbb
2个回答
3
投票

MySQL使用内部缓存来处理您的请求。数据库中更频繁的部分位于缓存中,而其他部分则不在。多次执行同一查询应该向您显示,就查询而言,第一个调用是查询且结果不在缓存中,最慢且连续的调用变得更快。对数据库所做的更改会使高速缓存无效,因此可能会使您的查询变慢,无法再次进行下一次调用。

第二点是联接。要匹配的数据越多,查询将运行的时间越长。您可以在“行”列中的说明中看到这一点。您的第一个查询将探索表“ p”的1004行,第二个查询只有476行。


0
投票

我解决了(我希望)在INNODB而不是MyISAM中转换phpbb_posts表。我不知道这是否是最好的解决方案,但是现在所有查询都可以使用正确的KEY INDEX快速运行。

我在第一篇文章中发布的第一个查询以前只需执行1.7011秒,现在只需要0.0017秒。

这是EXPLAIN结果:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.