我正在將腳本升級到具有新的數據庫佈局的新版本。升級開始正常,但慢慢開始需要更多的時間用於相同的查詢。有問題的查詢如下:使用多個JOIN優化MySQL查詢
SELECT nuser.user_id, nfriend.user_id AS friend_user_id, f.time
FROM oldtable_friends AS f
JOIN oldtable_user AS u ON (u.user = f.user)
JOIN newtable_user AS nuser ON (nuser.upgrade_user_id = u.id)
JOIN oldtable_user AS uf ON (uf.user = f.friend)
JOIN newtable_user AS nfriend ON (nfriend.upgrade_user_id = uf.id)
LIMIT 200
OFFSET 355600
這裏的OFFSET各不相同,因爲數據是以200批次的批次獲取的。
oldtable_friends擁有約2百萬條記錄。
oldtable_user和newtable_user有大約70,000條記錄。
該查詢一開始執行速度非常快,但慢慢開始累加,幾個小時後執行大約需要30秒。腳本升級時,這些表格根本不會改變,所以我不確定瓶頸在哪裏。看起來,隨着OFFSET變量的增長,查詢速度變慢。
這裏是解釋一下:
+----+-------------+---------+--------+-----------------+-----------------+---------+-----------------------------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+--------+-----------------+-----------------+---------+-----------------------------------+-------+-------------+
| 1 | SIMPLE | nuser | ALL | upgrade_user_id | NULL | NULL | NULL | 71638 | |
| 1 | SIMPLE | u | eq_ref | PRIMARY,user | PRIMARY | 4 | database.nuser.upgrade_user_id | 1 | |
| 1 | SIMPLE | f | ref | user,friend | user | 77 | database.u.user | 20 | |
| 1 | SIMPLE | uf | eq_ref | PRIMARY,user | user | 77 | database.f.friend | 1 | |
| 1 | SIMPLE | nfriend | ref | upgrade_user_id | upgrade_user_id | 5 | database.uf.id | 1 | Using where |
+----+-------------+---------+--------+-----------------+-----------------+---------+-----------------------------------+-------+-------------+
所有的桌子都被用在字段的索引。如果需要,我可以提供表結構。我一直在玩一些MySQL配置選項,儘管它有所改進,但並不多。有什麼建議麼?
該問題似乎與默認FCGI配置選項,使其超過20秒後超時。您可以將它添加到您的fcgid.conf中: IPCCommTimeout 60 – Martin 2010-02-27 07:01:51