同一 MySQL 数据库上的同一查询执行时间不同
The same query on the same MySQL database take different time to be executed
我有一个 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 秒,这是这种数据库请求的正常时间。
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 结果:
我使用这个板大约 15 年了,我从来没有注意到类似的问题,以及类似的打开主题的时间。但我无法理解问题出在哪里。
MySQL 使用内部缓存来处理您的请求。数据库中更频繁的部分在缓存中,而其他部分则不在。多次执行同一个查询应该告诉你,第一次调用是,就查询和结果不在缓存中而言,最慢和连续的调用变得更快。对数据库的更改会使缓存无效,因此您的查询可能会在下一次调用时变慢。
第二点是连接。需要匹配的数据越多,查询的时间就会越长运行。您可以在 "rows" 列的解释中看到这一点。您的第一个查询将探索 table "p" 的 1004 行,而第二个查询只有 476.
我解决了(我希望)在 INNODB 中转换 phpbb_posts table 而不是 MyISAM。我不知道这是否是最佳解决方案,但现在所有查询 运行 都使用正确的 KEY INDEX 快速查询。
我 post 首先 post 编辑的第一个查询,以前需要 1.7011 秒才能执行,现在只需要 0.0017 秒。
这是解释结果:
我有一个 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 秒,这是这种数据库请求的正常时间。
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 结果:
我使用这个板大约 15 年了,我从来没有注意到类似的问题,以及类似的打开主题的时间。但我无法理解问题出在哪里。
MySQL 使用内部缓存来处理您的请求。数据库中更频繁的部分在缓存中,而其他部分则不在。多次执行同一个查询应该告诉你,第一次调用是,就查询和结果不在缓存中而言,最慢和连续的调用变得更快。对数据库的更改会使缓存无效,因此您的查询可能会在下一次调用时变慢。
第二点是连接。需要匹配的数据越多,查询的时间就会越长运行。您可以在 "rows" 列的解释中看到这一点。您的第一个查询将探索 table "p" 的 1004 行,而第二个查询只有 476.
我解决了(我希望)在 INNODB 中转换 phpbb_posts table 而不是 MyISAM。我不知道这是否是最佳解决方案,但现在所有查询 运行 都使用正确的 KEY INDEX 快速查询。
我 post 首先 post 编辑的第一个查询,以前需要 1.7011 秒才能执行,现在只需要 0.0017 秒。
这是解释结果: