MySQL查詢用調(diào)度與鎖定來(lái)調(diào)優(yōu)
以下的文章主要介紹的是利用調(diào)度與鎖定對(duì)MySQL查詢進(jìn)行優(yōu)調(diào),在實(shí)際的操作中我們經(jīng)常會(huì)遇到讓單獨(dú)的MySQL數(shù)據(jù)庫(kù)查詢執(zhí)行的速度變快。MySQL數(shù)據(jù)庫(kù)還允許你改變其語(yǔ)句調(diào)度的優(yōu)先級(jí),它可以使來(lái)自多個(gè)客戶端的查詢更好地協(xié)作。
這樣單個(gè)客戶端就不會(huì)由于鎖定而等待很長(zhǎng)時(shí)間。
數(shù)據(jù)庫(kù)管理員工作中常會(huì)遇到讓單獨(dú)的MySQL查詢執(zhí)行的速度變快。MySQL還允許你改變語(yǔ)句調(diào)度的優(yōu)先級(jí),它可以使來(lái)自多個(gè)客戶端的MySQL查詢更好地協(xié)作,這樣單個(gè)客戶端就不會(huì)由于鎖定而等待很長(zhǎng)時(shí)間。
改變優(yōu)先級(jí)還可以確保特定類(lèi)型的查詢被處理得更快。下面我們來(lái)講解MySQL的默認(rèn)的調(diào)度策略和可以用來(lái)影響這些策略的選項(xiàng)。還有并發(fā)性插入操作的使用和存儲(chǔ)引擎鎖定層次對(duì)客戶端的并發(fā)性的影響。為了討論的方便,我們把執(zhí)行檢索(SELECT)的客戶端稱為"讀取者",把執(zhí)行修改操作(DELETE、INSERT、REPLACE或UPDATE)的客戶端稱為"寫(xiě)入者"。
MySQL查詢的默認(rèn)的調(diào)度策略可用總結(jié)如下:
寫(xiě)入操作優(yōu)先于讀取操作。
對(duì)某張數(shù)據(jù)表的寫(xiě)入操作某一時(shí)刻只能發(fā)生一次,寫(xiě)入請(qǐng)求按照它們到達(dá)的次序來(lái)處理。
對(duì)某張數(shù)據(jù)表的多個(gè)讀取操作可以同時(shí)地進(jìn)行。
MyISAM和MEMORY存儲(chǔ)引擎借助于數(shù)據(jù)表鎖來(lái)實(shí)現(xiàn)這樣的調(diào)度策略。當(dāng)客戶端訪問(wèn)某張表的時(shí)候,首先必須獲取它的鎖。當(dāng)客戶端完成對(duì)表的操作的時(shí)候,鎖就會(huì)被解除。通過(guò)LOCK TABLES和UNLOCK TABLES語(yǔ)句來(lái)顯式地獲取或釋放鎖是可行的,但是在通常情況下,服務(wù)器的鎖管理器會(huì)自動(dòng)地在需要的時(shí)候獲取鎖,在不再需要的時(shí)候釋放鎖。
獲取的鎖的類(lèi)型依賴于客戶端是寫(xiě)入還是讀取操作。
對(duì)某張表進(jìn)行寫(xiě)入操作的客戶端必須擁有獨(dú)占的(排他的)訪問(wèn)權(quán)的鎖。操作在進(jìn)行的過(guò)程中,該數(shù)據(jù)表處于不一致的(inconsistent)狀態(tài),因?yàn)閿?shù)據(jù)記錄在刪除、添加或修改的時(shí)候,數(shù)據(jù)表上的索引也可能需要更新以相互匹配。
這個(gè)數(shù)據(jù)表在變化的過(guò)程中,如果允許其它的客戶端訪問(wèn),會(huì)出現(xiàn)問(wèn)題。非常明顯,允許兩個(gè)客戶端同時(shí)寫(xiě)入一張數(shù)據(jù)表是不利的,因?yàn)檫@樣的操作會(huì)很快使數(shù)據(jù)表中的信息成為一堆無(wú)用的垃圾。但是允許客戶端讀取變化之中的數(shù)據(jù)表也不好,因?yàn)檎谧x取的位置中的數(shù)據(jù)可能正在變化(修改),讀取的結(jié)果可能不是真實(shí)的。
對(duì)某張表執(zhí)行讀取操作的客戶端必須獲取一個(gè)鎖,防止在讀取的過(guò)程中,其它的客戶端寫(xiě)入或改變表。但是這個(gè)鎖不需要獨(dú)占的訪問(wèn)權(quán)。讀取操作不會(huì)改變數(shù)據(jù),因此沒(méi)有理由讓某個(gè)讀取者阻止其它的讀取者訪問(wèn)這張表。因此讀取鎖允許其它的客戶端在同一時(shí)刻讀取這張表。
MySQL查詢提供了幾個(gè)語(yǔ)句調(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語(yǔ)句。
DELAYED關(guān)鍵字應(yīng)用于INSERT和REPLACE語(yǔ)句。
LOW_PRIORITY和HIGH_PRIORITY調(diào)節(jié)符影響那些使用數(shù)據(jù)表鎖的存儲(chǔ)引擎(例如MyISAM和MEMORY)。DELAYED調(diào)節(jié)符作用于MyISAM和MEMORY數(shù)據(jù)表。
【編輯推薦】