MySQL 5.7 MyISAM併發插入特性介紹
MyISAM儲存引擎支援併發插入來減少表讀寫之間的競爭。如果一張MyISAM表的資料檔案沒有洞(在表的中間有刪除行),在SELECT語句從表中讀取行的同時,一條插入語句在執行的時候可以將新插入的行增加到表的最後。如果有多個INSERT語句,它們會排成佇列並依次執行。併發插入的結果可能不會立刻可見。
系統引數concurrent_insert可以用來更改併發插入的處理。預設,這個引數的值是AUTO(或1),併發插入是開啟的;當這個引數設為NEVER (或0)時,併發插入是關閉的。當這個引數為ALWAYS (或 2)時,即使表中有刪除的行,併發插入也允許在表的後端執行。如果MySQL使用了二進位制日誌,併發插入會被轉化成普通的插入語句,例如CREATE...SELECT或INSERT ... SELECT語句。這樣做是為了保證可以透過應用日誌來重建表中的準確資料。另外,對於那些加了只讀鎖的表,併發插入動作會被阻塞,需要等待。
使用LOAD DATA INFILE語句,如果對一張滿足併發插入條件的MyISAM表指定了CONCURRENT選項(這張表的終極沒有空閒的資料塊),當LOAD DATA語句執行時,其他會話可以從這張表中查詢資料。使用CONCURRENT選項會對LOAD DA他的效能有少許影響,即使是在其他會話沒有使用這張表的情況下。如果指定了HIGH_PRIORITY選項,當MySQL服務以--low-priority-updates引數啟動時,它會覆蓋--low-priority-updates引數。它同時也會導致併發插入不會被使用。
mysql> show variables like '%low%priority%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| low_priority_updates | OFF |
+----------------------+-------+
1 row in set (0.00 sec)
如果這個引數的值設為1,所有的INSERT、UPDATE、DELETE和LOCK TABLE WRITE語句都會等待,直到在指定的MyISAM表上沒有懸掛的SELECT或LOCK TABLE READ語句。
這個引數只對使用表級鎖的儲存引擎生效(例如MyISAM、MEMORY和MERGE)。
對於LOCK TABLE語句,READ LOCAL和READ語句的區別是,當加鎖的時候,READ LOCAL允許插入語句和併發插入語句的執行。
mysql> show variables like '%concurrent%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| concurrent_insert | AUTO |
+-------------------+-------+
1 row in set (0.00 sec)
concurrent_insert
這個引數的預設值是AUTO,MySQL會允許併發插入,如果MyISAM表中間沒有被刪除的行,會在表尾插入資料。如果啟動mysqld帶有--skip-new引數,這個引數的是會被設為NEVER。
NEVER (或 0) 關閉併發插入
AUTO (或 1) 允許併發插入,如果MyISAM表中間沒有被刪除的行,會在表尾插入資料
ALWAYS (或 2) 允許併發插入,無論MyISAM表中間沒有被刪除的行,都會在表尾插入資料
mysql> show variables like 'concurrent%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| concurrent_insert | AUTO |
+-------------------+-------+
1 row in set (0.00 sec)
會話①
mysql> lock table test read local;
Query OK, 0 rows affected (0.00 sec)
同一會話內的插入或更新操作會失敗
mysql> insert into test values(90, 'Jimmy');
ERROR 1099 (HY000): Table 'test' was locked with a READ lock and can't be updated
mysql> update test set name='Trinity' where id=80;
ERROR 1099 (HY000): Table 'test' was locked with a READ lock and can't be updated
會話②
允許插入操作
mysql> insert into test values(90, 'Jimmy');
Query OK, 1 row affected (0.00 sec)
會話①
查詢會話②的新插入行,會查詢到空集
mysql> select * from test where id=90;
Empty set (0.00 sec)
mysql> show variables like '%isolation%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
會話②
更新操作會等待
mysql> update test set name='Trinity' where id=80;
Query OK, 1 row affected (1 min 10.11 sec)
直到會話①執行unlock tables語句,會話②才會結束等待
Rows matched: 1 Changed: 1 Warnings: 0
會話①
執行unlock tables語句後,可以成功查詢到會話②中新插入的資料
mysql> select * from test where id=90;
+------+-------+
| id | name |
+------+-------+
| 90 | Jimmy |
+------+-------+
1 row in set (0.00 sec)
系統引數concurrent_insert可以用來更改併發插入的處理。預設,這個引數的值是AUTO(或1),併發插入是開啟的;當這個引數設為NEVER (或0)時,併發插入是關閉的。當這個引數為ALWAYS (或 2)時,即使表中有刪除的行,併發插入也允許在表的後端執行。如果MySQL使用了二進位制日誌,併發插入會被轉化成普通的插入語句,例如CREATE...SELECT或INSERT ... SELECT語句。這樣做是為了保證可以透過應用日誌來重建表中的準確資料。另外,對於那些加了只讀鎖的表,併發插入動作會被阻塞,需要等待。
使用LOAD DATA INFILE語句,如果對一張滿足併發插入條件的MyISAM表指定了CONCURRENT選項(這張表的終極沒有空閒的資料塊),當LOAD DATA語句執行時,其他會話可以從這張表中查詢資料。使用CONCURRENT選項會對LOAD DA他的效能有少許影響,即使是在其他會話沒有使用這張表的情況下。如果指定了HIGH_PRIORITY選項,當MySQL服務以--low-priority-updates引數啟動時,它會覆蓋--low-priority-updates引數。它同時也會導致併發插入不會被使用。
mysql> show variables like '%low%priority%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| low_priority_updates | OFF |
+----------------------+-------+
1 row in set (0.00 sec)
如果這個引數的值設為1,所有的INSERT、UPDATE、DELETE和LOCK TABLE WRITE語句都會等待,直到在指定的MyISAM表上沒有懸掛的SELECT或LOCK TABLE READ語句。
這個引數只對使用表級鎖的儲存引擎生效(例如MyISAM、MEMORY和MERGE)。
對於LOCK TABLE語句,READ LOCAL和READ語句的區別是,當加鎖的時候,READ LOCAL允許插入語句和併發插入語句的執行。
mysql> show variables like '%concurrent%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| concurrent_insert | AUTO |
+-------------------+-------+
1 row in set (0.00 sec)
concurrent_insert
這個引數的預設值是AUTO,MySQL會允許併發插入,如果MyISAM表中間沒有被刪除的行,會在表尾插入資料。如果啟動mysqld帶有--skip-new引數,這個引數的是會被設為NEVER。
NEVER (或 0) 關閉併發插入
AUTO (或 1) 允許併發插入,如果MyISAM表中間沒有被刪除的行,會在表尾插入資料
ALWAYS (或 2) 允許併發插入,無論MyISAM表中間沒有被刪除的行,都會在表尾插入資料
mysql> show variables like 'concurrent%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| concurrent_insert | AUTO |
+-------------------+-------+
1 row in set (0.00 sec)
會話①
mysql> lock table test read local;
Query OK, 0 rows affected (0.00 sec)
同一會話內的插入或更新操作會失敗
mysql> insert into test values(90, 'Jimmy');
ERROR 1099 (HY000): Table 'test' was locked with a READ lock and can't be updated
mysql> update test set name='Trinity' where id=80;
ERROR 1099 (HY000): Table 'test' was locked with a READ lock and can't be updated
會話②
允許插入操作
mysql> insert into test values(90, 'Jimmy');
Query OK, 1 row affected (0.00 sec)
會話①
查詢會話②的新插入行,會查詢到空集
mysql> select * from test where id=90;
Empty set (0.00 sec)
mysql> show variables like '%isolation%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
會話②
更新操作會等待
mysql> update test set name='Trinity' where id=80;
Query OK, 1 row affected (1 min 10.11 sec)
直到會話①執行unlock tables語句,會話②才會結束等待
Rows matched: 1 Changed: 1 Warnings: 0
會話①
執行unlock tables語句後,可以成功查詢到會話②中新插入的資料
mysql> select * from test where id=90;
+------+-------+
| id | name |
+------+-------+
| 90 | Jimmy |
+------+-------+
1 row in set (0.00 sec)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26506993/viewspace-2123631/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 5.7 online DDL特性介紹MySql
- MySQL引擎介紹ISAM,MyISAM,HEAP,InnoDBMySql
- MySQL 5.7 NOT EXISTS用法介紹MySql
- MySQL 5.7 Performance Schema 介紹MySqlORM
- MySQL 5.7的主要特性簡介MySql
- MySQL 5.7 LIMIT語句介紹MySqlMIT
- MySQL 5.7 mysqldumpslow工具介紹MySql
- MySQL5.7新版本的運維,效能和新特性介紹MySql運維
- MySQL 5.7許可權的介紹MySql
- MySQL 5.7 mysql_install_db工具介紹MySql
- MySQL 8.0 新增特性介紹MySql
- MySQL·引擎特性·InnoDBChangeBuffer介紹MySql
- MySQL MyISAM/InnoDB高併發優化經驗MySql優化
- MySQL 5.7 PREPARE、EXECUTE、DEALLOCATE語句介紹MySql
- MySQL 5.7新特性MySql
- MySQL 8.0新特性更新介紹MySql
- MySQL5.7 JSON型別使用介紹MySqlJSON型別
- MySQL · 特性分析 · MySQL 5.7新特性系列一MySql
- MySQL 5.7 的事務控制語句的介紹MySql
- 【MySQL】5.7新特性之一MySql
- 【MySQL】5.7新特性之二MySql
- 【MySQL】5.7新特性之三MySql
- 【MySQL】5.7新特性之四MySql
- 【MySQL】5.7新特性之五MySql
- 【MySQL】5.7新特性之六MySql
- 【MySQL】5.7新特性之七MySql
- MySQL 5.7 新特性詳解MySql
- 論 MySql InnoDB 如何通過插入意向鎖控制併發插入MySql
- MySQL案例07:MySQL5.7併發複製隱式bugMySql
- [譯] part 20: golang 併發介紹Golang
- MySQL觸發器介紹MySql觸發器
- MyRocksTTL特性介紹
- MySQL 5.7 InnoDB引擎簡介MySql
- MySQL Galera Cluster的特性和不足之處介紹MySql
- MySQL5.6版本的新特性介紹MySql
- MySQL·引擎特性·InnoDB事務子系統介紹MySql
- Guava併發:ListenableFuture使用介紹以及示例Guava
- mysql常用儲存引擎(InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE)介紹與如何選擇MySql儲存引擎Hive