MySQL 5.7 MyISAM并发插入特性是什么

52次阅读
没有评论

共计 2864 个字符,预计需要花费 8 分钟才能阅读完成。

MySQL 5.7 MyISAM 并发插入特性是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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 DATA 的性能有少许影响,即使是在其他会话没有使用这张表的情况下。如果指定了 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)

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-27发表,共计2864字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)