【发布时间】:2020-08-30 02:13:38
【问题描述】:
我有一个 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
这个查询,虽然是一样的,但是在WHERE子句中使用了不同的ID主题,耗时0.0015秒,这是这种DB请求的正常时间。
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
我使用这个板大约 15 年了,我从来没有注意到类似的问题,以及类似的打开话题的时间。但我无法理解问题可能出在哪里。
【问题讨论】:
-
这可能是您的索引大小已经增长到不再适合内存的程度。在某些导致性能下降的 MySQL 版本上。
-
考虑分析 3 个表中的每一个,然后重试。可能需要刷新索引统计信息。所有表都是 innodb 吗?
-
@WilsonHauck 不,所有表都是 MyISAM。对这 3 个表执行 ANALYZE 命令不会返回错误。
-
现在已经用Analyze刷新了索引统计信息,这2个查询中的每一个需要多少时间?
-
和之前一样……一慢一快。