新聞中心
MySQL 5.7 MyISAM并發(fā)插入特性是什么 ,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、克東ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的克東網(wǎng)站制作公司
MyISAM存儲引擎支持并發(fā)插入來減少表讀寫之間的競爭。如果一張MyISAM表的數(shù)據(jù)文件沒有洞(在表的中間有刪除行),在SELECT語句從表中讀取行的同時,一條插入語句在執(zhí)行的時候可以將新插入的行增加到表的最后。如果有多個INSERT語句,它們會排成隊列并依次執(zhí)行。并發(fā)插入的結(jié)果可能不會立刻可見。
系統(tǒng)參數(shù)concurrent_insert可以用來更改并發(fā)插入的處理。默認(rèn),這個參數(shù)的值是AUTO(或1),并發(fā)插入是開啟的;當(dāng)這個參數(shù)設(shè)為NEVER (或0)時,并發(fā)插入是關(guān)閉的。當(dāng)這個參數(shù)為ALWAYS (或 2)時,即使表中有刪除的行,并發(fā)插入也允許在表的后端執(zhí)行。如果MySQL使用了二進(jìn)制日志,并發(fā)插入會被轉(zhuǎn)化成普通的插入語句,例如CREATE...SELECT或INSERT ... SELECT語句。這樣做是為了保證可以通過應(yīng)用日志來重建表中的準(zhǔn)確數(shù)據(jù)。另外,對于那些加了只讀鎖的表,并發(fā)插入動作會被阻塞,需要等待。
使用LOAD DATA INFILE語句,如果對一張滿足并發(fā)插入條件的MyISAM表指定了CONCURRENT選項(這張表的終極沒有空閑的數(shù)據(jù)塊),當(dāng)LOAD DATA語句執(zhí)行時,其他會話可以從這張表中查詢數(shù)據(jù)。使用CONCURRENT選項會對LOAD DATA的性能有少許影響,即使是在其他會話沒有使用這張表的情況下。如果指定了HIGH_PRIORITY選項,當(dāng)MySQL服務(wù)以--low-priority-updates參數(shù)啟動時,它會覆蓋--low-priority-updates參數(shù)。它同時也會導(dǎo)致并發(fā)插入不會被使用。
mysql> show variables like '%low%priority%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| low_priority_updates | OFF |
+----------------------+-------+
1 row in set (0.00 sec)
如果這個參數(shù)的值設(shè)為1,所有的INSERT、UPDATE、DELETE和LOCK TABLE WRITE語句都會等待,直到在指定的MyISAM表上沒有懸掛的SELECT或LOCK TABLE READ語句。
這個參數(shù)只對使用表級鎖的存儲引擎生效(例如MyISAM、MEMORY和MERGE)。
對于LOCK TABLE語句,READ LOCAL和READ語句的區(qū)別是,當(dāng)加鎖的時候,READ LOCAL允許插入語句和并發(fā)插入語句的執(zhí)行。
mysql> show variables like '%concurrent%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| concurrent_insert | AUTO |
+-------------------+-------+
1 row in set (0.00 sec)
concurrent_insert
這個參數(shù)的默認(rèn)值是AUTO,MySQL會允許并發(fā)插入,如果MyISAM表中間沒有被刪除的行,會在表尾插入數(shù)據(jù)。如果啟動mysqld帶有--skip-new參數(shù),這個參數(shù)的是會被設(shè)為NEVER。
NEVER (或 0) 關(guān)閉并發(fā)插入
AUTO (或 1) 允許并發(fā)插入,如果MyISAM表中間沒有被刪除的行,會在表尾插入數(shù)據(jù)
ALWAYS (或 2) 允許并發(fā)插入,無論MyISAM表中間沒有被刪除的行,都會在表尾插入數(shù)據(jù)
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)
同一會話內(nèi)的插入或更新操作會失敗
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)
直到會話①執(zhí)行unlock tables語句,會話②才會結(jié)束等待
Rows matched: 1 Changed: 1 Warnings: 0
會話①
執(zhí)行unlock tables語句后,可以成功查詢到會話②中新插入的數(shù)據(jù)
mysql> select * from test where id=90;
+------+-------+
| id | name |
+------+-------+
| 90 | Jimmy |
+------+-------+
1 row in set (0.00 sec)
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
網(wǎng)站題目:MySQL5.7MyISAM并發(fā)插入特性是什么
網(wǎng)站鏈接:http://www.dlmjj.cn/article/jhohsi.html