在 MySQL 中,向数据表插入数据时,索引、唯一性检查、数据大小是影响插入速度的主要因素。本节将介绍优化插入数据速度的几种方法。

根据不同情况,可以分别进行优化。

对于 MyISAM 引擎的表,常见的优化方法如下:

1. 禁用索引

对非空表插入数据时,MySQL 会根据表的索引对插入的记录进行排序。插入大量数据时,这些排序会降低插入数据的速度。为了解决这种情况,可以在插入数据之前先禁用索引,等到数据都插入完毕后在开启索引。

禁用索引的语句为:

ALTER TABLE table_name DISABLE KEYS;

重新开启索引的语句为:

ALTER TABLE table_name ENABLE KEYS;

对于新创建的表,可以先不创建索引,等到数据都导入以后再创建索引,这样可以提高导入数据的速度。

2. 禁用唯一性检查

插入数据时,MySQL 会对插入的数据进行唯一性检查。这种唯一性检验会降低插入数据的速度。为了降低这种情况对查询速度的影响,可以在插入数据前禁用唯一性检查,等到插入数据完毕后在开启。

禁用唯一性检查的语句为:

SET UNIQUE_CHECKS=0;

开启唯一性检查的语句为:

SET UNIQUE_CHECKS=1;

3. 使用批量插入

在 MySQL 中,插入多条数据有 2 种方式。第一种是使用一个 INSERT 语句插入多条数据。INSERT 语句的情形如下:

INSERT INTO items(name,city,price,number,picture)VALUES ('耐克运动鞋','广州',500,1000,'001.jpg'),('耐克运动鞋2','广州2',500,1000,'002.jpg');

第二种是一个 INSERT 语句只插入一条数据,执行多个 INSERT 语句来插入多条数据。INSERT 语句的情形如下:

INSERT INTO items(name,city,price,number,picture)  VALUES('耐克运动鞋','广州',500,1000,'001.jpg');
INSERT INTO items(name,city,price,number,picture)  VALUES('耐克运动鞋2','广州',500,1000,'002.jpg');

一次性插入多条数据和多次插入数据所耗费的时间是不一样的。第一种方式减少了与数据库之间的连接等操作,其速度比第二种方式要快一些。所以插入大量数据时,建议使用第一种方法。

注意:如果能用 LOAD DATA INFILE 语句,就尽量用 LOAD DATA INFILE 语句。因为 LOAD DATA
INFILE 语句导入数据的速度比 INSERT 语句的速度快。

对于 InnoDB 引擎的表,常见的优化方法如下:

1. 禁用唯一性检查
同 MyISAM 引擎相同,插入数据之前先禁用索引,等到数据都插入完毕后在开启索引。

2. 禁用外键检查
使用外键时,在子表中插入一条数据,首先会检查主表中是否有相应的主键值,然后锁定主表的记录,在插入值。相比较,使用外键多了2步操作,速度会慢一些。

所以我们可以在插入数据之前禁止对外键的检查,数据插入完成之后再恢复对外键的检查。不多对于数据完整性要求较高的系统不建议使用。

禁用外键检查语句为:

SET FOREIGN_KEY_CHECKS=0;

恢复对外键的检查语句为:

SET FOREIGN_KEY_CHECKS=1;

3. 禁止自动提交
在《MySQL设置事务自动提交》一节我们提到 MySQL 的事务自动提交模式默认是开启的,其对 MySQL 的性能也有一定得影响。也就是说如果你插入了 1000 条数据,MySQL 就会提交 1000 次,这大大影响了插入数据的速度。而如果我们把自动提交关掉,通过程序来控制,只要一次提交就可以了。

所以插入数据之前可以先禁止事务的自动提交,待数据导入完成之后,再恢复自动提交操作。

禁止自动提交语句为:

SET AUTOCOMMIT=0;

恢复自动提交语句为:

SET AUTOCOMMIT=1;

4、提高插入数据的速度相关推荐

  1. 数据库设计的核心原则 外键的设计 提高插入数据速度

    大道至简:数据库设计的核心原则 数据库设计,不得不承认,有很多专业化的理论知识,但是对于初学者来说,只需要大道至简的原则就可以了. 能不重复的就不重复,太重复的就拆开,使用指定数据做识别. 外键的设计 ...

  2. MySQL提高插入数据的效率(结合JDBC)

    0 解决问题最佳途径:直接找官方 先说明的是,有问题直接去找官方文档,而不应该去百度搜索,您很容易体验到,搜索引擎很难快速找到真正对您有价值的解决方案,而官方文档是最快捷的途径. 本篇也是基于官方文档 ...

  3. 如何提高mysql插入速度_mysql技巧:提高插入数据(添加记录)的速度

    问题描述: 普通台式机,采集数据,表中已经有1000万数据量. 采集回来的数据插入表中的时候很慢,每条约100毫秒. 解决方法: 1.加大mysql配置中的bulk_insert_buffer_siz ...

  4. PDI(Kettle)加速插入数据的速度

    本例背景为: 用PDI(Kettle) 向Mysql数据库导入大量的日志分析数据,开始导入的速度300+r/s, 通过设置如下JDBC的连接参数,明显提升了写入的速度. useServerPrepSt ...

  5. SQLServer使用表值参数,高性能批量插入数据

    记得前段时间帮同事写了个解析账号并入库的小工具,来批量导入账号信息,账号量相当大,程序每读取一条记录便执行一次insert来插入数据,整整跑了一下午才把账号全部入库. 今天又接到同事类似的需求,不过这 ...

  6. mysql年月分表_MySQL之按月拆分主表并按月分表写入数据提高数据查询速度

    使用场景: 主表数据量特别大,为了提高查询的速度,可以考虑按月进行分表,要求就是当月的数据到当月表查询,上月的数据到上月表查询,当天的数据到主表来查询.这样在一定程度上也是提高了数据的查询速度 过程演 ...

  7. 提高数据库效率的一些方法--eg:大批量循环插入数据的简化

    提高数据库效率的一些方法--eg:大批量循环插入数据的简化 作者及来源: 小奈鲁 - 博客园    收藏到→_→: 摘要: 提高数据库效率的一些方法--eg:大批量循环插入数据的简化 "提高 ...

  8. python游戏中调整箭头下落速度_入门 | 三行Python代码,让数据预处理速度提高2到6倍...

    原标题:入门 | 三行Python代码,让数据预处理速度提高2到6倍 选自TowardsDataScience 作者:George Seif,机器之心编译 在 Python 中,我们可以找到原生的并行 ...

  9. oracle 压缩 插入速度,求助大佬:向压缩表插入数据,压缩未生效

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 建表语句: create table ODS_M_ACC_BILL(month_id varchar2(6),...) compress PARTITIO ...

最新文章

  1. DbUtils工具类使用
  2. hdu As Easy As A+B
  3. php中图片上传_php实现图片上传并进行替换操作
  4. Java队列集合的性能测试
  5. 客户的一个紧急bug,我用了两种方式进行 C# 反编译修改源码
  6. Maven : mvn dependency:copy-dependencies
  7. Georgia Tech - machine learning 学习笔记一
  8. 对比两个文件内容差异VS Visual Studio Code
  9. Linux系统面试常问问题,最常见的Linux面试题集锦
  10. 《分布式微服务电商源码》-项目简介
  11. 在Android手机上对https请求进行抓包
  12. ciscn 2020 Misc the_best_ctf_game
  13. QT quick中的登录界面(Rectangle,TextField文本框的使用)
  14. 如何编辑简单打字游戏
  15. AI智能曲谱识别|乐谱识别识音SDK|人声数拍SDK|智能钢琴、MIDI音乐、打谱、曲谱乐谱播放识别SDK、音序器、合成器、播放器软件
  16. “打工人”都在用的邮件使用规范
  17. 常用校验方式以及优缺点(奇偶校验,CRC校验,校验和)
  18. matlab程序模拟微信抢红包,js模拟微信抢红包算法的讨论
  19. 做技术,也有“七年之痒”
  20. OpenOffice桌面环境(Desktop Environment)

热门文章

  1. 成功解决object at 0x000002463192BAC8
  2. Dataset:数据集集合(综合性)——机器学习、深度学习算法中常用数据集大集合(建议收藏,持续更新)
  3. 【综述】深度长尾学习
  4. STM32启动文件详解及SystemInit函数分析
  5. FCKeditor 2.6.4.1 初始化值不能显示中文问题
  6. Gradle 教程:第一部分,安装【翻译】
  7. hdu 4739 状压DP
  8. STM8学习笔记---串口uart1
  9. Day04-经典卷积神经网络解读
  10. java商品展示页面代码_java学习(十四)实现商品的展示、curd以及分页展示