我有一個 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_infosFROM phpbb_posts p, phpbb_users u, phpbb_topics tWHERE p.topic_id = 17278AND t.topic_id = p.topic_idAND u.user_id = p.poster_idORDER BY p.post_time ASCLIMIT 0, 15這是解釋結果:這個查詢,它是相同的,但它在 WHERE 子句中使用不同的 ID 主題,需要 0.0015 秒,這是這種數據庫請求的正常時間。FROM phpbb_posts p, phpbb_users u, phpbb_topics tWHERE p.topic_id = 17250AND t.topic_id = p.topic_idAND u.user_id = p.poster_idORDER BY p.post_time ASCLIMIT 0, 15這是此查詢的 EXPLAIN 結果:我使用這個板大約 15 年了,我從來沒有注意到類似的問題,以及類似的打開主題的時間。但我無法理解問題出在哪里。
1 回答

浮云間
TA貢獻1829條經驗 獲得超4個贊
MySQL 使用內部緩存來處理您的請求。數據庫中更頻繁的部分在緩存中,而其他部分則不在。多次執行同一個查詢應該告訴你,第一次調用是,就查詢和結果不在緩存中而言,最慢和連續的調用變得更快。對數據庫的更改會使緩存無效,因此您的查詢可能會在下一次調用時變慢。
第二點是連接。需要匹配的數據越多,查詢運行的時間就越長。您可以在“行”列中的解釋中看到這一點。您的第一個查詢將探索表“p”的 1004 行,而第二個查詢只有 476 行。
- 1 回答
- 0 關注
- 159 瀏覽
添加回答
舉報
0/150
提交
取消