mysql> show status like 'table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Table_locks_immediate | 19 |
| Table_locks_waited | 0 |
+-----------------------+-------+
2 rows in set (0.00 sec)mysql
MyISAM表讀操做,不會阻塞其餘用戶對同一表的讀請求,但會阻塞對同一表的寫請求;
MyISAM表的寫操做,會阻塞其餘用戶對同一表的讀請求和寫請求。
MyISAM表的讀操做和寫操做之間,以及寫操做之間是串行的sql
MyISAM表在執行SELECT語句以前,會自動給涉及到的表加讀鎖,在執行UPDATE、DELETE、INSERT以前,自動給涉及到的表加寫鎖。markdown
mysql> lock table tbl_name1 read/write;
mysql> lock tables tbl_name1 read [local], tbl_name2 write [local];併發
mysql> unlock tables;app
mysql> lock table tbl_name1 as tb1 read;
mysql> select a.id from tbl_name tb1;ide
MyISAM的讀寫操做是串行的,但必定程度上,也是支持查詢和插入的併發進行,但不能夠刪除和更新。spa
0-> 不容許併發插入;
1-> 在MyISAM表沒有孔洞的前提下,容許在讀的同時,另外一個進程從尾部插入記錄(默認)
2-> 不論有無空洞,均可以在表尾併發插入orm
mysql> optimize table tbl_name;索引
已經知道,MyISAM存儲引擎的讀鎖和寫鎖是互斥的,讀寫操做是串行的,可是,及時讀請求先到達等待隊列,寫請求後到達等待隊列,寫鎖也會插入到讀鎖以前,由於MySQL認爲寫操做比讀操做重要。隊列
同時,這也是MyISAM表不適合有大量更新和查詢操做的緣由,由於大量的更新和查詢操做會佔據鎖等待隊列,讀鎖會被長時間等待。
爲了解決這個問題,咱們有一些參數設置來調節MyISAM的調度行爲。
啓動low-priority-updates,使得MyISAM 默認基於讀請求以優先的權利;
下降更新請求的的優先級
mysql> set LOW_PRIORITY_UPDATES=1
指定INSERT、UPDATE、DELETE語句的LOW_PRIORITY屬性,下降該語句的優先級
一種折中的方案:給系統參數max_write_locl_count設置一個合適的值,當表的讀操做達到該值以後,MySQL就暫時將寫請求的優先級下降。
InnoDB與MyISAM的最大不一樣支出在於:一、支持事務;二、採用了行級鎖。
mysql> show status like 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 0 |
| Innodb_row_lock_time_avg | 0 |
| Innodb_row_lock_time_max | 0 |
| Innodb_row_lock_waits | 0 |
+-------------------------------+-------+
5 rows in set (0.00 sec)
對於UPDATE、DELETE、INSERT語句,InnoDB自動給涉及數據集加排他鎖;對於SELECT語句,InnoDB不會加任何鎖。