Myisam表的concurrent inserts特性

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

一、特性介绍

在某些特定的情况下,Myisam引擎支持并发插入(concurrent inserts),以降低读操作和写操作的争用:如果一个myisam表的数据文件中间没有空闲块(free blocks),那么新的数据行将总是被插入到数据文件的末尾,在这种情况下,该myisam表上将允许同时有insert和select操作而不会有锁冲突。也就是说,当myisam表上有其它会话在读取表数据,你也照样可以执行insert操作。

二、concurrent_insert参数

Myisam表中间的数据行被删除或更新,就可能导致空闲块。如果表文件中间有空闲块,那么并发插入特性将不生效,直到空闲块被数据行填满后才自动生效。Myisam引擎的这种行为,可以通过系统变量concurrent_insert来控制:

mysql> show variables like '%concurrent_insert%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| concurrent_insert | AUTO  |
+-------------------+-------+

该参数有三个值:never、auto、always。
值为never(或0),不启用并发插入功能;
值为auto(或1),自动模式,当数据文件中间没有空闲块则启用,否则自动取消;
值为always(或2):即便表数据文件中间有空闲块也始终启用并发插入。当有空闲块时,表上有其它会话的读操作,这时新的数据行将被插入到文件的末尾;如果表上没有其它操作,那么insert操作就是一个正常的操作:获得一个写锁,并优先将数据行插入空闲块中。

三、测试示例

在空表myisam_tb中导入了64条数据,无任何删除操作,且表引擎为myisam。在session1上模拟出一个对myisam_tb表的慢查询:

mysql> select *,sleep(1) from myisam_tb where sex='f';
执行时间40s,输出结果忽略

此时在session2上,插入id为65的数据:

mysql> insert into myisam_tb values(65,'he','f',385685.32,'fbbf');
Query OK, 1 row affected (0.01 sec)

可以看到insert语句数据直接可以插入进去,并没有发生锁等待现象。将myisam_tb表中删除中间一部分数据:

mysql> delete from myisam_tb where id between 20 and 40;
Query OK, 21 rows affected (0.01 sec)

再执行慢查询:

mysql> select *,sleep(1) from myisam_tb where sex='f';

另外一个会话上再执行insert语句,插入一条新数据:

mysql> insert into myisam_tb values(66,'he','f',385685.32,'fbbf');
Query OK, 1 row affected (25.57 sec)

可以看到语句执行了25s,这是因为表有空闲块,concurrent_insert参数值为auto,所以出现了锁等待。
将concurrent_insert参数值修改为always:

mysql> show variables like '%concurrent%';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| concurrent_insert | ALWAYS |
+-------------------+--------+

Session1上再执行一个慢查询:

mysql> select *,sleep(1) from myisam_tb;
执行时间45s,输出结果忽略

session2上插入一条数据:

mysql> insert into myisam_tb values(67,'hgj','f',3232,'bngj');
Query OK, 1 row affected (0.00 sec)

可以看出在concurrent_insert参数值改为always后,即便是有空闲块,新插入的数据也是插在数据文件的末尾。同样也可以实现查询与插入操作并存,不过空闲块空间不会被利用。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
21小时前
|
存储 算法 关系型数据库
InnoDB与MyISAM实现索引方式的区别
InnoDB和MyISAM均采用B+树索引,但在实现上有所不同。InnoDB的主键索引在叶子节点存储完整数据记录,辅助索引则存储主键值;而MyISAM的主键索引与数据文件分离,仅存数据地址,且主辅索引无区别,支持非唯一主索引。
9 1
|
9天前
|
存储 安全 关系型数据库
InnoDB引擎特性
InnoDB事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。MySQL5.5.5之后,InnoDB作为默认存储引擎,InnoDB主要特性有: InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供了一个类似Oracle的非锁定读。 InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘关系的数据库引擎所不能匹敌的。 InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池
|
存储 SQL 缓存
InnoDB、MyISAM、Memory 存储引擎 的区别
InnoDB、MyISAM、Memory 存储引擎 的区别
139 0
|
存储 算法 关系型数据库
|
存储 关系型数据库 MySQL
InnoDB与MyISAM实现索引方式的区别
InnoDB和MyISAM是MySQL中常见的两种存储引擎,它们在实现索引方式上有一些区别。下面我将简述InnoDB和MyISAM实现索引的方式和特点。
123 0
|
存储 SQL 自然语言处理
MySQL索引简介 - InnoDB和MyISAM索引模型
MySQL索引简介 - InnoDB和MyISAM索引模型
104 0
|
关系型数据库 MySQL 数据库
MyISAM和InnoDB区别
MyISAM和InnoDB区别
MyISAM和InnoDB区别
|
SQL 关系型数据库 MySQL
innodb 和myisam数据表类型的区别
innodb 和myisam数据表类型的区别
83 0
|
存储 关系型数据库 数据库
简述MyISAM和InnoDB的区别????
简述MyISAM和InnoDB的区别????
100 0
|
存储 安全 关系型数据库
数据库引擎InnoDB与MyISAM区别
数据库引擎InnoDB与MyISAM区别
数据库引擎InnoDB与MyISAM区别