萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql中update的low_priority

mysql中update的low_priority

下面我們來看一篇關於mysql中update的low_priority,以前一個同事做過今天我們來看看,希望文章對各位能夠帶來幫助.

low_priority,低優先級
UPDATE [LOW_PRIORITY] tbl_name SET col_name1=expr1,col_name2=expr2,…

mysql中update用low_priority讓update不鎖定表

MySQL允許你改變語句調度的優先級,它可以使來自多個客戶端的查詢更好地協作,這樣單個客戶端就不會由於鎖定而等待很長時間。改變優先級還可以確保特定類型的查詢被處理得更快。這一部分講解MySQL的默認的調度策略和可以用來影響這些策略的選項。它還談到了並發性插入操作的使用和存儲引擎鎖定層次對客戶端的並發性的影響。為了討論的方便,我們把執行檢索(SELECT)的客戶端稱為"讀取者",把執行修改操作(DELETE、INSERT、REPLACE或UPDATE)的客戶端稱為"寫入者"。

(在不要求實時的情況下,寫入可以降低跟新插入操作的優先級,確保讀的速度。當然,也有更好的方法來完成這個目的,主從,中間緩存,都可以。)

 

MySQL的默認的調度策略可用總結如下:

· 寫入操作優先於讀取操作。

· 對某張數據表的寫入操作某一時刻只能發生一次,寫入請求按照它們到達的次序來處理。

· 對某張數據表的多個讀取操作可以同時地進行。

 

MyISAM和MEMORY存儲引擎借助於數據表鎖來實現這樣的調度策略。當客戶端訪問某張表的時候,首先必須獲取它的鎖。當客戶端完成對表的操作的時候,鎖就會被解除。通過LOCK TABLES和UNLOCK TABLES語句來顯式地獲取或釋放鎖是可行的,但是在通常情況下,服務器的鎖管理器會自動地在需要的時候獲取鎖,在不再需要的時候釋放鎖。獲取的鎖的類型依賴於客戶端是寫入還是讀取操作。

對某張表進行寫入操作的客戶端必須擁有獨占的(排他的)訪問權的鎖。操作在進行的過程中,該數據表處於不一致的(inconsistent)狀態,因為數據記錄在刪除、添加或修改的時候,數據表上的索引也可能需要更新以相互匹配。這個數據表在變化的過程中,如果允許其它的客戶端訪問,會出現問題。非常明顯,允許兩個客戶端同時寫入一張數據表是不利的,因為這樣的操作會很快使數據表中的信息成為一堆無用的垃圾。但是允許客戶端讀取變化之中的數據表也不好,因為正在讀取的位置中的數據可能正在變化(修改),讀取的結果可能不是真實的。

對某張表執行讀取操作的客戶端必須獲取一個鎖,防止在讀取的過程中,其它的客戶端寫入或改變表。但是這個鎖不需要獨占的訪問權。讀取操作不會改變數據,因此沒有理由讓某個讀取者阻止其它的讀取者訪問這張表。因此讀取鎖允許其它的客戶端在同一時刻讀取這張表。

MySQL提供了幾個語句調節符,允許你修改它的調度策略:

· LOW_PRIORITY關鍵字應用於DELETE、INSERT、LOAD DATA、REPLACE和UPDATE。

· HIGH_PRIORITY關鍵字應用於SELECT和INSERT語句。

· DELAYED關鍵字應用於INSERT和REPLACE語句。

LOW_PRIORITY和HIGH_PRIORITY調節符影響那些使用數據表鎖的存儲引擎(例如MyISAM和MEMORY)。DELAYED調節符作用於MyISAM和MEMORY數據表。

改變語句調度的優先級

LOW_PRIORITY關鍵字影響DELETE、INSERT、LOAD DATA、REPLACE和UPDATE語句的執行調度。通常情況下,某張數據表正在被讀取的時候,如果有寫入操作到達,那麼寫入者一直等待讀取者完成操作(查詢開始之後就不能中斷,因此允許讀取者完成操作)。如果寫入者正在等待的時候,另一個讀取操作到達了,該讀取操作也會被阻塞(block),因為默認的調度策略是寫入者優先於讀取者。當第一個讀取者完成操作的時候,寫入者開始操作,並且直到該寫入者完成操作,第二個讀取者才開始操作。

如果寫入操作是一個LOW_PRIORITY(低優先級)請求,那麼系統就不會認為它的優先級高於讀取操作。在這種情況下,如果寫入者在等待的時候,第二個讀取者到達了,那麼就允許第二個讀取者插到寫入者之前。只有在沒有其它的讀取者的時候,才允許寫入者開始操作。理論上,這種調度修改暗示著,可能存在LOW_PRIORITY寫入操作永遠被阻塞的情況。如果前面的讀取操作在進行的過程中一直有其它的讀取操作到達,那麼新的請求都會插入到LOW_PRIORITY寫入操作之前。

SELECT查詢的HIGH_PRIORITY(高優先級)關鍵字也類似。它允許SELECT插入正在等待的寫入操作之前,即使在正常情況下寫入操作的優先級更高。另外一種影響是,高優先級的SELECT在正常的SELECT語句之前執行,因為這些語句會被寫入操作阻塞。

如果你希望所有支持LOW_PRIORITY選項的語句都默認地按照低優先級來處理,那麼請使用–low-priority-updates選項來啟動服務器。通過使用INSERT HIGH_PRIORITY來把INSERT語句提高到正常的寫入優先級,可以消除該選項對單個INSERT語句的影響。mysql中update的low_priority

 

copyright © 萬盛學電腦網 all rights reserved