2011-11-20 61 views
0

在MySQL進程列表中,它顯示了幾個SELECT查詢已被鎖定。的鎖定節目超過4000MySQL進程列表 - 鎖定問題

| 24 | user | localhost | database | Query | 4725 | Locked | SELECT * FROM data 
| 25 | user | localhost | database | Query | 4725 | Locked | SELECT * FROM data 
| 26 | user | localhost | database | Query | 4725 | Locked | SELECT * FROM data 

PHP腳本的時間已經執行過一段時間,但隨後在SELECT鎖定狀態成了。如何解決這個問題呢?

$SQL = "SELECT * FROM data"; 
$query = $db->prepare($SQL); 
$query->execute(); 
while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 
    //Do something 
    sleep(2); 
} 

是否mySQL服務器限制SELECT查詢在一次運行一次?這可以改變嗎?

回答

2

您應該運行show engine innodb status \G來查看持有該鎖的查詢。

經過討論,在評論和聽證會上,MyISAM正在使用中,並且有很多寫道,我建議你轉到InnoDB。

InnoDB一直是默認引擎一段時間,通常更好。在這種情況下,您將獲得基於行的鎖定。 InnoDB也正在開發比MyISAM更多的功能。

+0

我正在使用MyISAM –

+0

哦,我已經忘記了關於myisam的所有信息:( –

+0

MyISAM鎖定了整個表,當它寫入並且沒有讀取可以完成,直到該鎖被釋放。在寫入之前被執行,等等,但在你的情況下,它看起來好像有一個寫入阻止你的讀取。 –

0

如果您的進程列表中只有選擇語句,這可能是由服務器上可用資源有限造成的。如果出現這種情況,可以嘗試優化可能運行的查詢,或嘗試在服務器上實現某種緩存,從而避免此問題。您也可以降低max_connections系統變量,但這可能不是一個可行的解決方案。

0

你的桌子有多大?

INNODB不是魔術。有關係統的一些信息可以提供幫助。

+0

超過140,000行...首先使用'SELECT'查詢,然後做一個LO t'UPDATE'。服務器規格是:英特爾酷睿2四核Q8300,4GB,Linux。 MySQL服務器CPU 100%高 –

+0

SELECT * FROM 140K rows?我可以理解爲什麼它緩慢而沉重。 –

+0

另外,你的MySQL版本是什麼? –