萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MyISAM存儲引擎的表級鎖定優化

MyISAM存儲引擎的表級鎖定優化

MyISAM存儲引擎的表級鎖定優化

MySQL支持對MyISAM和MEMORY表進行表級鎖定,對BDB表進行頁級鎖定,對InnoDB 表進行行級鎖定。
表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,並發度最低。
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,並發度也最高。
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,並發度一般。
MySQL的表級鎖有兩種模式:表共享讀鎖和表獨占寫鎖。對MyISAM表的讀操作,不會阻塞其他用戶對同一表的讀請求,但會阻塞對同一表的寫請求;對 MyISAM表的寫操作,則會阻塞其他用戶對同一表的讀和寫操作;MyISAM表的讀操作與寫操作之間,以及寫操作之間是串行的!
對於大表,對於大多數應用程序,表鎖定比行鎖定更好,但存在部分缺陷。表鎖定使許多線程同時從一個表中進行讀取操作,但如果一個線程想要對表進行寫操作,它必須首先獲得獨占訪問。更新期間,所有其它想要訪問該表的線程必須等待直到更新完成。
針對MyISAM存儲引擎的表級鎖定特點:
1、減小sql語句的執行時間;
2、數據表的索引保證合理高效;
3、設置SELECT語句優於更新操作(INSERT,UPDATE,DELETE)執行,降低寫操作的優先權;
   通過指定啟動參數low-priority-updates,使MyISAM引擎默認給予讀請求以優先的權利。

   通過執行命令SET LOW_PRIORITY_UPDATES=1,使該連接發出的更新請求優先級降低。

   通過指定INSERT、UPDATE、DELETE語句的LOW_PRIORITY屬性,降低該語句的優先級。

4、使用臨時表提高查詢性能;
   查詢數據較多時,可以通過SQL_BUFFER_RESULT.選項強制將結果放到臨時表中,這樣就可以很快釋放Mysql的表鎖;
5、表結構設計,盡量避免同一表有大量更新與查詢混在一起,合理進行拆表;
6、表存在結合大量INSERT和SELECT操作時,選擇支持並發的SELECT和INSERT操作。
 
   MyISAM存儲引擎有一個系統變量concurrent_insert,專門用以控制其並發插入的行為,其值分別可以為0、1或2。
   當concurrent_insert設置為0時,不允許並發插入。
   當concurrent_insert設置為1時,如果MyISAM表中沒有空洞(即表的中間沒有被刪除的行),MyISAM允許在一個進程讀表的同時,另一個進程從表尾插入記錄。這也是MySQL的默認設置。
   當concurrent_insert設置為2時,無論MyISAM表中有沒有空洞,都允許在表尾並發插入記錄。

copyright © 萬盛學電腦網 all rights reserved