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日

相关文章

  • mysql 按照时间段来获取数据的方法

    获取 MySQL 数据库中某个时间段之内的数据是开发中经常遇到的问题,在 MySQL 中,可以使用 WHERE 子句的 BETWEEN 运算符或者 > 和 < 运算符来实现。下面是具体步骤: 步骤一:准备数据 首先,我们需要准备一张包含时间信息的表,例如: CREATE TABLE `mytable` ( `id` int(11) NOT NUL…

    database 2023年5月22日
    00
  • MySQL基本命令、常用命令总结

    MySQL基本命令、常用命令总结 MySQL是一款常用的关系型数据库管理系统,使用广泛,为了能够更好地使用MySQL,以下是MySQL基本命令和常用命令的总结,希望对你有所帮助。 基本命令 连接MySQL 使用以下命令连接到MySQL服务器: mysql -u 用户名 -p 其中,用户名为数据库用户的名称,例如: mysql -u root -p 连接成功后…

    database 2023年5月22日
    00
  • PHP下的Oracle客户端扩展(OCI8)安装教程

    下面就为您详细讲解“PHP下的Oracle客户端扩展(OCI8)安装教程”的完整攻略。 简介 OCI8 是 PHP 下操作 Oracle 数据库的客户端扩展。为了使用 OCI8 ,需要在 PHP 环境下安装 OCI8 扩展。开始安装之前,需要准备好以下环境: PHP 版本:PHP7.2.x 及以上版本 Oracle 数据库客户端版本:Oracle Insta…

    database 2023年5月22日
    00
  • scrapy数据存储在mysql数据库的两种方式(同步和异步)

    Scrapy是一个用于爬取网页并提取数据的Python框架。在爬取数据后,我们需要把数据保存到数据库中进行后续处理,使其更方便的进行分析和应用。Scrapy支持将数据存储到多种不同类型的数据库中,其中包括MySQL。在MySQL数据库中,Scrapy数据存储的主要方式是同步和异步。 同步方式 同步方式是指将数据存储到MySQL数据库时,采用常规的同步方式,遵…

    database 2023年5月18日
    00
  • MyBatis Generator生成的$ sql是否存在注入风险详解

    “MyBatis Generator生成的$ sql是否存在注入风险详解”攻略如下: 1. 什么是MyBatis Generator MyBatis Generator是一个开源工具,可以自动化地生成MyBatis基于XML映射文件和Java POJO的代码。它可以根据数据库表结构自动生成对应的Java Bean和Mapper接口。使用MyBatis Gen…

    database 2023年5月21日
    00
  • UTC时间、GMT时间、本地时间、Unix时间戳的具体使用

    下面我来详细讲解一下UTC时间、GMT时间、本地时间、Unix时间戳的具体使用。 UTC时间 UTC(Coordinated Universal Time)即协调世界时,也称世界统一时间。它是以原子时秒长为基础,在不考虑地球自转及地球固定架构变化的情况下所测定的时间。UTC时间与格林威治标准时间(GMT)不同的是,它不使用夏令时。 在使用UTC时间时,我们可…

    database 2023年5月22日
    00
  • linux 常见的标识与Redis数据库详解

    Linux 常见的标识 文件权限标识 Linux系统中,每个文件都有自己的权限标识,包括文件所有者、文件所属组和文件其他用户的权限。其中,文件的权限标识用10位二进制数来表示,分为三组,每组用三位表示。具体如下: 文件所有者权限:读取(r)、写入(w)、执行(x),用 rwx 表示,分别对应二进制数值 4、2、1;文件所属组权限:读取(r)、写入(w)、执行…

    database 2023年5月22日
    00
  • Mysql DATEDIFF函数示例详解

    MySQL DATEDIFF函数示例详解 MySQL DATEDIFF函数用于计算两个日期之间的差值。DATEDIFF函数接受两个日期参数(参数类型为 DATE 或 DATETIME)并返回两个日期之间的天数差。 DATEDIFF语法 DATEDIFF(date1, date2) 其中,date1和date2参数可以是下列任意一种: DATE: 表示日期,例…

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