Mysql

mysql更新後帶有子查詢的大型查詢無限期執行

  • July 7, 2016

我們最近進行了一次大型伺服器更新,在從 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;

一些基本資訊:

  • 兩者都是peopleMyISAMresults
  • 兩個表都有主鍵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)

如果這沒有幫助,讓我們嘗試將查詢從裡到外翻轉。

引用自:https://dba.stackexchange.com/questions/91012