mysql MyISAM的表鎖優化mysql
mysql 比oracle 靈活的地方有:能夠對每一張表進行引擎的設定。咱們最經常使用的兩種引擎就是MyISAM 和 Innodb。但若是沒有搞清楚兩種引擎的區別的話,仍是很容易出問題的。
sql
1、InnoDB支持事務,MyISAM不支持,這一點是很是之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪一個出錯還能夠回滾還原,而MyISAM就不能夠了。數據庫
2、MyISAM適合查詢以及插入爲主的應用,InnoDB適合頻繁修改以及設計到安全性就高的應用安全
3、InnoDB支持外鍵,MyISAM不支持oracle
4、InnoDB中不保存表的行數,如select count(*) from table時,InnoDB須要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可。注意的是,當count(*)語句包含where條件時MyISAM也須要掃描整個表優化
五、清空整個表時,InnoDB是一行一行的刪除,效率很是慢。MyISAM則會重建表spa
六、InnoDB支持行鎖(某些狀況下仍是鎖整表,如 update table set a=1 where user like '%lee%'.net
上面的七條來至(http://www.jb51.net/article/54352.htm),可是這個只是比較粗淺的認識。設計
咱們當時有一張表選擇MyISAM的時候是由於該存儲引擎比Innodb速度塊不少,當時咱們作的是採集系統,爲了提升效率就採起的是批量插入。雖然咱們開始知道MyISAM是表鎖的狀況,可是咱們殊不知道正好在批量插入的時候,一個簡單的select語句會被阻塞這麼久。(開始沒有遇到,偶然發現的,還好當時沒有上線)這個時候去查了一些MyISAM存儲引擎的一些更深刻的特性發現:對 MyISAM表的寫操做,則會阻塞其餘用戶對同一表的讀和寫操做;MyISAM表的讀操做與寫操做之間,以及寫操做之間是串行的!因此其實MyISAM存儲引擎適合,一些讀操做遠遠大於寫操做頻率的業務,但咱們又很喜歡該引擎的批量插入的速度。最後強行改了讀操做的優先級(不推薦使用有血淚史),並開啓了concurrent_insert=2的模式。第一個是先保證用戶查詢操做優先,第二是開啓並行插入,這個插入是有要求的(插入到表的最後,不影響當前的查詢操做)。就不會調整插入位置了,若是有部分數據會刪除的記得要:按期使用OPTIMIZE TABLE語法優化,能夠減少文件的碎片。code
//設置並行插入的sql,也能夠去修改my.conf set global concurrent_insert=2;
最後仍是推薦使用Innodb存儲引擎, 上次聽一個數據庫講座時候說的,MyISAM已經好久沒有更新過了,因此如今數據庫都是默認使用Innodb,並且優化了不少版本的Innodb查詢速度並不差MyISAM存儲引擎了(並且穩定性前者更是高的多)。