Mysql
mysql更新後帶有子查詢的大型查詢無限期執行
我們最近進行了一次大型伺服器更新,在從 mysql-5.0 遷移到 5.5.40 的過程中,一些在舊伺服器上執行良好的查詢現在使一切都停止了。經過一番調查,我想出了以下觸發問題的最小查詢範例:
SELECT (SELECT date FROM results WHERE person_id = people.id ORDER BY results.date DESC limit 1 ) AS date FROM people WHERE people.boss_id = 123;
一些基本資訊:
- 兩者都是
people
MyISAMresults
表- 兩個表都有主鍵ID,沒有其他索引
results
是我們較大的桌子之一,目前大約有 400 萬行people.boss_id = 123
過濾到約 3000 行- 上面的查詢在舊的 mysql-5.0 伺服器上執行大約 4 秒
- 在較新的 mysql-5.5 伺服器上,對同一數據集的相同類型的查詢已經執行了長達三個小時,然後我手動終止了該程序,在此期間它報告為“正在發送數據”我的研究表明,這意味著數據庫是過濾數據,但我對此不是 100% 確定的。
- 在較新的伺服器上執行上述查詢會產生相同的結果:卡住查詢“發送數據”,直到我手動終止該程序。
- 兩張表都可以自己正常工作
- 我實際上可以執行子查詢的單個隔離版本(即在哪里
person_id = 123
或其他)。在較新的伺服器上需要幾微秒。這是一個的
EXPLAIN EXTENDED
樣子:select_type table type possible_keys key key_len ref rows filtered Extra PRIMARY people ref boss_id boss_id 4 const 4217 100.00 ---- DEPENDENT SUBQUERY results index boss_id date 32 NULL 1 1700.00 Using where
那麼,關於導致這種情況的任何想法?我有點卡住了。我遇到了某種錯誤嗎?升級到 mysql-5.6 可以解決這個問題(畢竟它有一個新的查詢計劃器)?將一個或兩個表更改為 InnoDB 可能有幫助嗎?修理一張桌子或另一張桌子會有幫助嗎?
順便說一句,這個問題令人討厭的副作用之一是它鎖定了 phpmyadmin。實際上,這有點令人不安。命令行執行良好,但 phpmyadmin 只會坐在那裡”
$$ loading $$“直到我通過命令行殺死流氓程序。關於為什麼卡住的查詢可能會這樣做的任何想法?
這在 MYSQL 中不起作用?
試一試——你會失去什麼?
SELECT people.id, max(results.date) FROM people JOIN results on people.id = results.person_id and people.boss_id = 123 GROUP BY people.id;
將從以下索引中受益:
1)results.person_id
2)people.boss_id
日期索引可能會有所幫助,但開始時沒有
子查詢不一定得到很好的優化。這是一個“相關”子查詢,因此很難重新表述。
請向我們展示每個表的 SHOW CREATE TABLE - 可能存在微妙的問題,例如數據類型。
試試這個“複合”索引
results
:INDEX(person_id, date)如果這沒有幫助,讓我們嘗試將查詢從裡到外翻轉。