2014-09-05 98 views
4

MySQL中的表是MyISAM。鎖定MyISAM表(MySQL)和PHP

現在我想選擇許多數據。

$res = $db->query("SELECT ..."); 
// -- Break 1 
while($row = $res->fetch_assoc()) { 
//working with the row; 
} 
// -- Break 2 

什麼時候表上的鎖結束?在休息1還是休息2?

+2

這是一個很好的和深入的關於表鎖的閱讀:http://dev.mysql.com/doc/refman/5.1/en/internal-locking.html – 2014-09-05 13:30:54

+0

也許分析SQL給了一些關於何時mysql freeing table。[詳細說明](http://dev.mysql.com/doc/refman/5.5/en/show-profile.html) – 2014-09-05 13:34:24

+0

沒有鎖定。 – sectus 2014-09-05 13:37:31

回答

0

@bauer據我瞭解你的問題。接近我的答案是,無論何時使用while循環,並且您有一個資源對象或變量用於迭代,它只在頁面上執行一次,因爲一旦迭代完成,對象或相應變量就會自由並且包含null,所以爲了運行while循環,你需要定義不同的obj,而不管你的結果集是什麼。

0

// - Break 1

數據在此行之前的過程中加載。表被釋放。

從這一點進一步的數據操作是在PHP應用程序中,不再需要數據庫中的數據。

至於先前的評論,沒有數據鎖定,這取決於你的觀點。如果您的查詢快速返回兩條記錄,則會顯示沒有鎖定(技術上不正確,但很容易弄錯)。但是,如果你的查詢很複雜,而且你的結果很龐大,那麼需要一些時間才能返回結果(比如45秒),那麼MyISAM中確實存在一個表鎖的情況將變得非常明顯。在45秒內返回一個簡單的「顯示過程列表」清楚地顯示鎖定的表格。 (等待表級鎖定是一種死亡贈品)。在較大的Vicidial裝置上每天都會發生。

索引表可以減少鎖定時間。設置「限制50」(某些數字限制結果數據集)可以縮短鎖定時間,如果這也是查詢的可行選項。

另請注意,鎖定有一些繞過的方法,這取決於試圖「播放」的查詢。選擇vs插入vs更新通常可以相互繞過(這就是鎖定機制的研究可以派上用場的地方)。測試是確定你理解它的好主意。不要害怕創建一個包含3000萬條記錄的表,並運行一個巨大的查詢來查看選擇/插入/更新之間的鎖和什麼,而其中一個是巨大的,另一個是微小的,試圖「玩」,而大一個正在運行。即使您認爲自己「明白了」,結果也會讓您大吃一驚。然後注意顯式聲明查詢不太重要的能力,以及後續查詢旋轉它們的類型時會發生什麼。