前言

当要向MariaDB中插入新的数据时,以下过程会影响插入所消耗的时间:(按时间消耗长短降序排序)

  • 将数据sync到磁盘上(它是事务结束的一部分)
  • 添加新的键值。索引越大,更新键值所消耗的时间就越长。
  • 检查外键约束(如果存在)。
  • 将行添加到存储引擎中。
  • 将待插入数据发送给服务器。

下面介绍几种向表中快速插入数据的技术(按效率的提升程度降序排序)。

1. 禁用索引(key)

你可以临时禁用非唯一索引。特别是在表中数据很少甚至没有数据的时候,禁用非唯一索引可以极大提升插入速度。

多数存储引擎(至少MyISAM和Aria是如此)的ENABLE KEYS会扫描表中的行并收集索引键值,然后对它们排序,最后创建索引块。

因此,先禁用KEY,插入数据后启用KEY的整体速度比每行都更新一次索引的速度至少要快一个数量级,并且所需要的buffer也更少。

注意:当使用INSERT或 LOAD DATA空表中插入数据时,MariaDB会自动DISABLE KEYS,插入成功后再自动ENABLE KEYS

当插入海量数据时,花在完整性检查上的时间也会很长。可以通过禁用UNIQUE索引以及删除主外键约束节省时间;

此外,如果表上有INSERT触发器,或者PERSISTENT字段,可以先删除它们,在数据插入完成之后再重建它们。

2. 使用INSERT语句插入数据

2.1 使用事务

当需要使用单行insert语句(一次插入一行)插入数据时,可以将它们放进事务中,从而避免每行一次事务(意味着每行都需要将数据sync到磁盘)。

例如,每个事务中包含1000次insert,这至少提升1000倍插入效率。

2.2 insert语句的多值插入

你可以使用insert语句一次性插入多行数据,例如:

INSERT INTO table_name values(1,"row 1"),(2, "row 2"),...;

系统变量max_allowed_packet控制了该语句允许的最大行数量。

3. 可以优化插入速度的服务器变量

innodb_buffer_pool_size:如果你的InnoDB/XtraDB表中有多个索引,可增大该值

key_buffer_size:如果你的MyISAM表中有多个索引,可增大该值

max_allowed_packet : 增大该值以允许insert语句可以一次性插入更多的行(即增加insert语句中括号的个数)

MariaDB快速批量插入数据的几种办法的更多相关文章

  1. SQLServer 批量插入数据的两种方法

    SQLServer 批量插入数据的两种方法-发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Ins ...

  2. SQL 2005批量插入数据的二种方法

    SQL 2005批量插入数据的二种方法 Posted on 2010-07-22 18:13 moss_tan_jun 阅读(2635) 评论(2) 编辑 收藏 在SQL Server 中插入一条数据 ...

  3. MySQL批量插入数据的几种方法

    最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别 别的先不说,先上一段代码与君共享 方法一: package com.bigdata; ...

  4. net core天马行空系列-各大数据库快速批量插入数据方法汇总

    1.前言 hi,大家好,我是三合.我是怎么想起写一篇关于数据库快速批量插入的博客的呢?事情起源于我们工作中的一个需求,简单来说,就是有一个定时任务,从数据库里获取大量数据,在应用层面经过处理后再把结果 ...

  5. SQL Server 批量插入数据的两种方法

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍 SQL Server支持的两种批 ...

  6. SQL Server 批量插入数据的两种方法(转)

    此文原创自CSDN TJVictor专栏:http://blog.csdn.net/tjvictor/archive/2009/07/18/4360030.aspx 在SQL Server 中插入一条 ...

  7. 转:SQL Server 批量插入数据的两种方法

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...

  8. MyBatis 批量插入数据的 3 种方法!

    批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 ...

  9. 使用JDBC在MySQL数据库中快速批量插入数据

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(10W+),如何提高效率呢? 在JDBC编程接口中Statement 有两个方法特别值得注意: void addBatch ...

随机推荐

  1. Java并发编程指南

    多线程是实现并发机制的一种有效手段.在 Java 中实现多线程有两种手段,一种是继承 Thread 类,另一种就是实现 Runnable/Callable 接口. java.util.concurre ...

  2. JS DOM节点增删改查 属性设置

    一.节点操作 增 createElement(name)创建元素 appendChild();将元素添加   删 获得要删除的元素 获得它的父元素 使用removeChild()方法删除 改 第一种方 ...

  3. spring boot(15)-异常处理

    异常传递 如图:服务层和dao层的异常最终都会到达控制层,控制层的异常则会自动记入logback日志系统.所以我们应该在控制层来捕获系统异常 捕获控制层异常 import org.slf4j.Logg ...

  4. npm 删除node_modules

    安装 npm install rimraf - g 使用 rimraf node_modules

  5. 服务器安装LNMP及构建个人站点

    服务器安装LNMP(centos6.6+nginx1.7.12+mysql5.6.24+php5.6.7) 本次安装  centos6.6+nginx1.7.12+mysql5.6.24+php5.6 ...

  6. 占位符 %s

    a = input("Name:")b = input("Age:")c = input("Job:")d = input("ho ...

  7. jetbrains全家桶永久激活大法

    不得不说jetbrains的产品真的挺好用的,比如耳熟能详的idea和pycharm等等,但正版的费用真的非我等学生党所能承担,网上也有一些注册码的教程,原理是通过服务器进行注册认证,但貌似目前用的比 ...

  8. RabbitMQ学习以及与Spring的集成(二)

    本文介绍RabbitMQ的一些基本概念. RabbitMQ服务可以安装在独立服务器上,通过配置的账户和ip访问使用.也就是说,RabbitMQ和使用它的应用可以部署在不同的服务器上.RabbitMQ的 ...

  9. DotNET中的幕后英雄:MSCOREE.DLL

    现在做.NET Framework的开发的朋友应该是越来越多了,但是可能并非人人都对MSCOREE.DLL非常了解.而事实上,毫不夸张地说,MSCOREE.DLL是.NET Framework中最为核 ...

  10. django 取model字段的verbose_name值

    Django 模型中的verbose_name我们常常可能需要使用.比如将数据库里面的数据导出成csv文件,那么csv文件的表头的名字可以通过取每个字段的verbose_name来获取,数据可以通过q ...