MySQL 5.7 MyISAM并发插入特性是啥
发布时间:2022-01-12 13:03:31 所属栏目:MySql教程 来源:互联网
导读:MySQL 5.7 MyISAM并发插入特性是什么 ,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 MyISAM存储引擎支持并发插入来减少表读写之间的竞争。如果一张MyISAM表的数据文
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 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) 会话① 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) 看完上述内容是否对您有帮助呢? (编辑:丽水站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |