MySQL的默認(rèn)的調(diào)度策略可用總結(jié)如下:
? 寫入操作優(yōu)先于讀取操作。
? 對某張數(shù)據(jù)表的寫入操作某一時刻只能發(fā)生一次,寫入請求按照它們到達的次序來處理。
? 對某張數(shù)據(jù)表的多個讀取操作可以同時地進行。
MyISAM和MEMORY存儲引擎借助于數(shù)據(jù)表鎖來實現(xiàn)這樣的調(diào)度策略。當(dāng)客戶端訪問某張表的時候,首先必須獲取它的鎖。當(dāng)客戶端完成對表的操作的時候,鎖就會被解除。通過LOCK TABLES和UNLOCK TABLES語句來顯式地獲取或釋放鎖是可行的,但是在通常情況下,服務(wù)器的鎖管理器會自動地在需要的時候獲取鎖,在不再需要的時候釋放鎖。獲取的鎖的類型依賴于客戶端是寫入還是讀取操作。
對某張表進行寫入操作的客戶端必須擁有獨占的(排他的)訪問權(quán)的鎖。操作在進行的過程中,該數(shù)據(jù)表處于不一致的(inconsistent)狀態(tài),因為數(shù)據(jù)記錄在刪除、添加或修改的時候,數(shù)據(jù)表上的索引也可能需要更新以相互匹配。這個數(shù)據(jù)表在變化的過程中,如果允許其它的客戶端訪問,會出現(xiàn)問題。非常明顯,允許兩個客戶端同時寫入一張數(shù)據(jù)表是不利的,因為這樣的操作會很快使數(shù)據(jù)表中的信息成為一堆無用的垃圾。但是允許客戶端讀取變化之中的數(shù)據(jù)表也不好,因為正在讀取的位置中的數(shù)據(jù)可能正在變化(修改),讀取的結(jié)果可能不是真實的。
對某張表執(zhí)行讀取操作的客戶端必須獲取一個鎖,防止在讀取的過程中,其它的客戶端寫入或改變表。但是這個鎖不需要獨占的訪問權(quán)。讀取操作不會改變數(shù)據(jù),因此沒有理由讓某個讀取者阻止其它的讀取者訪問這張表。因此讀取鎖允許其它的客戶端在同一時刻讀取這張表。
MySQL提供了幾個語句調(diào)節(jié)符,允許你修改它的調(diào)度策略:
? LOW_PRIORITY關(guān)鍵字應(yīng)用于DELETE、INSERT、LOAD DATA、REPLACE和UPDATE。
? HIGH_PRIORITY關(guān)鍵字應(yīng)用于SELECT和INSERT語句。
? DELAYED關(guān)鍵字應(yīng)用于INSERT和REPLACE語句。
LOW_PRIORITY和HIGH_PRIORITY調(diào)節(jié)符影響那些使用數(shù)據(jù)表鎖的存儲引擎(例如MyISAM和MEMORY)。DELAYED調(diào)節(jié)符作用于MyISAM和MEMORY數(shù)據(jù)表。
改變語句調(diào)度的優(yōu)先級
LOW_PRIORITY關(guān)鍵字影響DELETE、INSERT、LOAD DATA、REPLACE和UPDATE語句的執(zhí)行調(diào)度。通常情況下,某張數(shù)據(jù)表正在被讀取的時候,如果有寫入操作到達,那么寫入者一直等待讀取者完成操作(查詢開始之后就不能中斷,因此允許讀取者完成操作)。如果寫入者正在等待的時候,另一個讀取操作到達了,該讀取操作也會被阻塞(block),因為默認(rèn)的調(diào)度策略是寫入者優(yōu)先于讀取者。當(dāng)?shù)谝粋€讀取者完成操作的時候,寫入者開始操作,并且直到該寫入者完成操作,第二個讀取者才開始操作。
如果寫入操作是一個LOW_PRIORITY(低優(yōu)先級)請求,那么系統(tǒng)就不會認(rèn)為它的優(yōu)先級高于讀取操作。在這種情況下,如果寫入者在等待的時候,第二個讀取者到達了,那么就允許第二個讀取者插到寫入者之前。只有在沒有其它的讀取者的時候,才允許寫入者開始操作。理論上,這種調(diào)度修改暗示著,可能存在LOW_PRIORITY寫入操作永遠被阻塞的情況。如果前面的讀取操作在進行的過程中一直有其它的讀取操作到達,那么新的請求都會插入到LOW_PRIORITY寫入操作之前。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com