以下的文章主要介紹的是利用調度與鎖定對MySQL查詢進行優調,在實際的操作中我們經常會遇到讓單獨的MySQL數據庫查詢執行的速度變快。MySQL數據庫還允許你改變其語句調度的優先級,它可以使來自多個客戶端的查詢更好地協作。
這樣單個客戶端就不會由於鎖定而等待很長時間。
數據庫管理員工作中常會遇到讓單獨的MySQL查詢執行的速度變快。MySQL還允許你改變語句調度的優先級,它可以使來自多個客戶端的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數據表。