mysql 数据插入优化方法之concurrent_insert

yizhihongxing

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存储过程 MySQL存储过程是MySQL提供的一种数据库服务程序,用于封装一系列SQL语句,便于以后调用和重用。使用存储过程,可以减少网络传输量,降低系统开销,增强数据安全性等优点。MySQL存储过程非常适用于复杂的业务逻辑和数据处理。 MySQL存储过程的语法结构 MySQL存储过程的语法结构如下: DELI…

    database 2023年5月22日
    00
  • c#之Redis队列

    摘要 这两天一直在考虑redis队列:一个生产者,多个消费者的情况,这里弄了一个demo进行测试。 一个例子 关于如何引用Redisclient 可以参考之前的这篇文章:c#之Redis实践list,hashtable 生产者一个线程,然后开启多个线程用来消费数据。 代码如下: using System; using System.Collections.G…

    Redis 2023年4月12日
    00
  • MybatisPlus保存、读取MySQL中的json字段失败问题及解决

    根据你的要求,以下是“MybatisPlus保存、读取MySQL中的json字段失败问题及解决”的完整攻略。 问题描述 在使用MybatisPlus操作MySQL数据库时,如果遇到要保存或读取包含JSON类型字段的表时,可能会出现保存或读取失败的情况。具体表现为:保存后JSON字段丢失或读取时解析失败。 问题分析 出现这种情况的原因主要有两个: MySQL版…

    database 2023年5月18日
    00
  • Redis 实现队列原理的实例详解

    Redis 实现队列原理的实例详解 什么是 Redis 队列? Redis 队列是一种基于 Redis 数据库的数据结构,它可以满足任务异步执行的需求。将需要执行的任务放入队列中,然后通过另一个进程或者线程来消费队列中的任务。Redis 队列可以实现任务任务的异步、高效、可靠执行。 Redis 队列实现原理 Redis 队列的实现原理是基于 Redis 的 …

    database 2023年5月22日
    00
  • 详解MongoDB创建数据库步骤

    MongoDB是一款基于文档存储的非关系型数据库,以下是如何创建数据库的完整攻略。 安装MongoDB 首先需要在计算机上安装MongoDB,安装方法可以查看官方文档或者从MongoDB官网下载安装程序,根据安装向导完成安装。 启动MongoDB服务 在安装完成后,需要启动MongoDB服务。在Windows系统中,可以通过运行CMD或者PowerShell…

    MongoDB 2023年3月14日
    00
  • 五、mysql中sql语句分类及常用操作

    1.sql语句分类: DQL语句  数据查询语言  select DML语句  数据操作语言  insert delete update  DDL语句  数据定义语言  create drop alter TCL语句  事务控制语言  commit rollback 2.创建一个新的数据库,create database database_name; 删除一…

    MySQL 2023年4月13日
    00
  • linux下mysql忘记密码的解决方法

    下面为您详细讲解在 Linux 下 MySQL 忘记密码的解决方法。 解决方法 方法一:通过忘记密码向导重置密码 停止 MySQL 服务:sudo systemctl stop mysql 在启动时将 MySQL 服务配置成跳过授权表(即跳过密码验证)模式启动,并设定一个新密码: shell sudo mysqld_safe –skip-grant-tab…

    database 2023年5月22日
    00
  • MySQL日期及时间字段的查询

    MySQL中有许多日期和时间类型的数据,比如DATETIME、DATE、TIME、YEAR、TIMESTAMP等。这些日期和时间类型的数据查询方法类似,都可以使用各种函数和操作符进行比较、相加、格式化等操作。 查询某个时间段内的记录 要查询某个时间段内的记录,可以使用BETWEEN操作符和AND关键字。 例如,要查询2019年1月1日至2019年12月31日…

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