mysql 数据插入优化方法之concurrent_insert

MySQL 数据插入优化方法之 concurrent_insert

concurrent_insert 是 MySQL 数据插入优化的一种方法。它可以通过将新的索引插入页分离(FSP)空闲列表,从而在插入新记录时提高并发性能。

concurrent_insert 参数设置

concurrent_insert 有三个可选参数:

  • OFF: 禁用此功能(默认值);
  • 1: 启用,但仅在 MyISAM、CSV 和 ARCHIVE 存储引擎中生效;
  • 2(AUTO): 启用,对所有支持的存储引擎生效,但条件受限。

concurrent_insert 被开启的情况下,会出现如下两种情况:

  1. 在插入数据时,如果数据页已经被一个线程锁定,其他线程仍然可以通过 FSP 空闲列表操作插入新的数据页。
  2. INSERT 操作优化:当数据页已满后,如果开启了 concurrent_insert,MySQL 会创建一个新的数据页,并先将该数据页插入 FSP 空闲列表中,再将新的记录插入该数据页,从而减少了数据页的分裂和碎片。

concurrent_insert 示例说明

示例 1:在 MyISAM 中使用 concurrent_insert

首先,我们需要创建一个 MyISAM 表并设置 concurrent_insert 参数值为 1

CREATE TABLE test (
    id INT PRIMARY KEY,
    name VARCHAR(255)
) ENGINE=MyISAM;

ALTER TABLE test SET concurrent_insert=1;

接着,我们在该表中插入 10 万条数据,并准备查看插入性能。

INSERT INTO test (id, name)
SELECT i, CONCAT('name_', i)
FROM (
    SELECT 1 AS i 
    UNION ALL SELECT 2 AS i 
    UNION ALL SELECT 3 AS i 
    ..... 
    UNION ALL SELECT 100000 AS i 
) a;

通过 SHOW STATUS LIKE 'Handler_write' 命令,可以查看到写入数据行数。

接着,我们可以对比开启和关闭 concurrent_insert 时的性能提高,性能提高的幅度根据数据大小而定。

示例 2:在 InnoDB 中使用 concurrent_insert

在 InnoDB 表中使用 concurrent_insert 时,需要添加 innodb_autoinc_lock_mode 参数,如果该参数值为 1,则表示在没有锁定整个表的情况下并发插入记录,这会提高插入性能。

创建一个 InnoDB 表并设置 concurrent_insertinnodb_autoinc_lock_mode 参数:

CREATE TABLE test (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255)
) ENGINE=InnoDB;

ALTER TABLE test SET concurrent_insert=1;

SET GLOBAL innodb_autoinc_lock_mode=1;

接着,与上述示例一样,在该表中插入 10 万条数据,以比较开启和关闭 concurrent_insert 时的性能提高。

总结

concurrent_insert 是 MySQL 数据插入优化的一种方法,可以通过在插入新记录时将新的索引插入到页分离(FSP)空闲列表中,从而提高并发性能。

在 MyISAM、CSV 和 ARCHIVE 存储引擎中,concurrent_insert 可设置为 1,即可启用并发插入特性。

在 InnoDB 表中使用 concurrent_insert 时,需要添加 innodb_autoinc_lock_mode 参数,并将其设置为 1,以达成并发插入的效果。通过对比开启和关闭 concurrent_insert 的执行周期,可以清楚地看到 MySQL 并发插入性能的提高。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql 数据插入优化方法之concurrent_insert - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • SQL查询字段被包含语句

    SQL查询字段被包含语句,通常是用于查找包含指定关键词的数据行。下面是详细的攻略: 1. 理解SQL查询字段被包含语句 SQL查询语句中,使用 LIKE 运算符进行模糊匹配。比如,我们要查找包含关键词 “apple” 的数据行,可以使用以下查询语句: SELECT * FROM table_name WHERE column_name LIKE ‘%appl…

    database 2023年5月21日
    00
  • Spring boot中mongodb的使用

    下面是关于“Spring Boot中Mongodb的使用”的完整攻略: 配置Mongodb 在Spring Boot中使用Mongodb,需要在项目的pom文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g…

    database 2023年5月22日
    00
  • 解析MySQL8.0新特性——事务性数据字典与原子DDL

    解析MySQL8.0新特性——事务性数据字典与原子DDL 背景 在MySQL 8.0版本中,引入了事务性数据字典和原子DDL。这两个特性对于MySQL数据库的可靠性和性能有着很大的影响。在本文中,我们将详细讲解这两个新特性并提供示例说明。 事务性数据字典 事务性数据字典是MySQL8.0引入的一个新特性。事务性数据字典将MySQL系统元数据信息存储在一个独立…

    database 2023年5月22日
    00
  • SpringCloud+Eureka+Feign+Ribbon的简化搭建流程,加入熔断,网关和Redis缓存[2]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 [toc]## 前提:本篇是基于 SpringCloud+Eureka+Feign+Ribbon的简化搭建流程和CRUD练习[1] 的修改与拓展 1.修改consumer的CenterFeign.java,把返回值全部设置为String /** * 是consumer调用provider(需要指定provi…

    Redis 2023年4月11日
    00
  • Centos7.4 zabbix3.4.7源码安装的方法步骤

    下面是Centos7.4 zabbix3.4.7源码安装的方法步骤的完整攻略。 1. 安装依赖 在安装Zabbix之前,需要安装一些系统和库依赖,以确保一切顺利。在CentOS上,可以使用以下命令安装这些依赖: yum -y install gcc gcc-c++ mariadb-devel mariadb-libs mariadb httpd php ph…

    database 2023年5月22日
    00
  • 如何把本地mysql迁移到服务器数据库

    将本地MySQL数据库迁移到服务器数据库可以通过以下步骤实现: 1. 备份本地MySQL数据库 使用以下命令将本地MySQL数据库备份到本地计算机上: mysqldump -u 用户名 -p 密码 数据库名称 > 导出文件名.sql 2. 将备份的文件上传到服务器 使用以下命令将备份的文件上传到服务器: scp /本地备份文件的路径/导出文件名.sql…

    database 2023年5月22日
    00
  • redis常用命令、常见错误、配置技巧等分享

    Redis常用命令 String类型命令 SET key value:将键key的值设为value。 GET key:获取键key的值。 DEL key:删除键key。 List类型命令 LPUSH key value:向键key的左边(头部)插入值value,如果key不存在,则创建。 RPUSH key value:向键key的右边(尾部)插入值valu…

    database 2023年5月18日
    00
  • 在MAMP环境下安装MySQLdb的方法

    下面是在MAMP环境下安装MySQLdb的详细攻略: 步骤一:安装MAMP 下载MAMP软件安装包,可以在官网上下载,选择适合自己系统的版本。 双击安装包,完成MAMP的安装,启动MAMP即可。 步骤二:安装MySQLdb 使用终端进入MAMP的MySQL目录: cd /Applications/MAMP/Library/bin 安装MySQLdb: sud…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部