2013-10-04 31 views
4

我正在使用MySQL 5.5.25服務器和InnoDB作爲我的數據庫。MySQL查詢隨機掛在'發送數據'狀態?

很多時候,由於mysqld進程大約一分鐘,服務器的CPU通常工作在100%。使用SHOW PROCESSLIST:

Command | Time | State  | Info 
Query | 100 | Sending data | SELECT a.prefix, a... 
Query | 107 | Sending data | SELECT a.prefix, a... 
Query | 50 | Sending data | SELECT a.prefix, a... 

有問題的查詢是:

SELECT a.prefix, a.test_id, a.method_id, b.test_id 
FROM a 
LEFT JOIN b ON b.test_id = a.test_id 
AND user_id = ? 
AND year = ? 

所有這些列索引,因此這不是問題。另外,當我在phpMyAdmin中運行查詢(具有足夠的LIMIT)時,需要0.05秒才能完成。另外,我發現無法自己再現這個問題,即使同時執行兩次查詢併發送垃圾郵件只能給我40%的CPU帶來麻煩,這也是非常令人沮喪的。

前綴來查詢說明的結果:

Id | select_type | table | type | possible_keys  | key  | key_len | ref   | rows | Extra 
1 | SIMPLE  | a  | ALL | NULL     | NULL | NULL | NULL   | 1169 | 
1 | SIMPLE  | b  | ref | user_id,year,test_id | test_id | 4  | db.a.test_id | 58 | 

除非我不能看到什麼是正確的在我的面前,我尋找各種方法來發現如何調試這樣的問題。我已經記錄了所有的查詢和執行時間,以及它們的值等等。但是由於我無法複製它,所以我被卡住了。我該怎麼做才能弄清楚這個問題是關於什麼的?

+5

根據行數,表格的大小是多少。禁用查詢緩存,如果它啓用,然後再現。你有什麼CPU,線程數等exucute顯示引擎innodb狀態\ G,爲僵局年輕人/非年輕人loog,然後開始挖掘問題... –

+0

感謝您的評論,如果它是一個答案,而不是評論我會接受它。 – Yeti

回答

5

哇,感謝馬蘇德阿拉姆的評論,我發現並解決了這個問題。使用SHOW ENGINE INNODB STATUS證明對調試非常有幫助。

事實證明,對於user_id的某些值,數據庫處理事情的方式不同,因此其行爲不可預知,無法重現問題。通過狀態命令,我可以複製和粘貼當前正在運行的確切查詢。

這是該特定值的EXPLAIN的結果user_id

Id | select_type | table | type   | possible_keys  | key   | key_len | ref | rows | Extra 
1 | SIMPLE  | a  | ALL   | NULL     | NULL   | NULL | NULL | 841 | 
1 | SIMPLE  | b  | index_merge | user_id,year,test_id | user_id,year | 4,4  | NULL | 13 | Using intersect(user_id,year); Using where 

的後續問題將現在怎麼這種行爲可以解釋的。然而,要解決這個問題,我只是爲了查詢更改爲:

SELECT a.prefix, a.test_id, a.method_id, b.test_id 
FROM a 
LEFT JOIN b ON b.test_id = a.test_id 
WHERE 
b.id IS NULL 
OR user_id = ? 
AND year = ? 

其中EXPLAIN結果:

Id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra 
1 | SIMPLE  | a  | ALL | NULL   | NULL | NULL | NULL   | 671 | 
1 | SIMPLE  | b  | ref | test_id  | test_id | 4  | db.a.test_id | 49 | Using where 

現在我知道,InnoDB的可以用於執行給定的查詢不同的方法不同的輸入值。爲什麼?我仍然不知道。