Mysql千万级别数据批量插入,性能提高

-----------------------------------------------------------方式1 ----------------------------------------------------------------------------------------

第一步:配置my.ini文件

文件中配置

bulk_insert_buffer_size=120M 或者更大

将insert语句的长度设为最大。

Max_allowed_packet=1M

Net_buffer_length=8k

保存

第二步:查看设置的参选有没有生效.

Mysql > SHOW VARIABLES;

bulk_insert_buffer_size默认是8M,我们要把它调成100M或百兆以上,也不要太大。下面看调整个好的,如下图:

第三步:完成设置后,批量插入数据时使用多条模式。

INSERT INTO table (field1,field2,field3) VALUES (‘a‘,"b","c"), (‘a‘,"b","c"),(‘a‘,"b","c");

----------------------------------------------------------- 方式2 ----------------------------------------------------------------------------------------

python中单个和批量增加更新的mysql(没有则插入,有则更新)

建表语句:

DROP TABLE IF EXISTS `stock_discover`;
CREATE TABLE `stock_discover` (
  `code` char(6) NOT NULL,
  `index` int(11) unsigned NOT NULL DEFAULT ‘0‘,
  `name` varchar(20) NOT NULL,
  `exchange` varchar(10) NOT NULL DEFAULT ‘‘,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `yesterday` double unsigned NOT NULL,
  PRIMARY KEY (`code`,`index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

单个添加更新

如果记录在表中不存在则进行插入,如果存在则进行更新:

sql = "INSERT INTO stock_discover VALUES (‘%s‘, 2, ‘%s‘, ‘HZ‘, ‘%s‘, ‘%s‘)"        " ON DUPLICATE KEY UPDATE `date` = ‘%s‘ , yesterday = ‘%s‘‘"
#数据格式
data = [‘000005‘, u‘合肥‘, ‘2018-09-19 14:55:21‘, u‘2520.64‘]
sql = sql % (data[0], data[1], data[2], data[3], data[2], data[3])

cursor.execute(sql)

批量添加更新
在更新大量数据时可能同时遇到两个问题:
① 如果每条更新执行一次sql性能很低,也容易造成阻塞;
② 批量更新时又有可能遇到主键重复的问题
使用 ON DUPLICATE KEY UPDATE 一条sql解决批量更新和主键重复问题(id为主键),使用executemany进行批量插入

# 记录在表中不存在则进行插入,如果存在则进行更新
sql = "INSERT INTO `stock_discover` VALUES (%s, %s, %s, %s, %s, %s) "           "ON DUPLICATE KEY UPDATE `date` = VALUES(`date`) , yesterday = VALUES(yesterday)"

#数据格式如下:
data_info = [(‘000005‘, 2, u‘合肥‘, ‘HZ‘, ‘2018-09-19 14:55:21‘, u‘2520.64‘),
             (‘000006‘, 2, u‘北京‘, ‘HZ‘, ‘2018-09-19 14:55:21‘, u‘2694.92‘),
             (‘000007‘, 2, u‘上海‘, ‘HZ‘, ‘2018-09-19 14:55:21‘, u‘2745.38‘)]

#批量插入使用executement
cursor.executemany(sql, data_info)

注意: ON DUPLICATE KEY UPDATE是mysql特有的语法,对于其他sql并不一定适用

也可以使用如下方法:

Mysql插入数据的SQL语句主要有:

1、insert into表示插入数据,数据库会检查主键,如果出现重复会报错;

2、replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;

3、insert ignore表示,如果表中如果已经存在相同的记录,则忽略当前新数据;

create table testtb(
id int not null primary key,
name varchar(50),
age int
);
insert into testtb(id,name,age)values(1,‘bb‘,13);
select * from testtb;
insert ignore into testtb(id,name,age)values(1,‘aa‘,13);
select * from testtb;
replace into testtb(id,name,age)values(1,"aa",12);
select * from testtb;

原文地址:https://www.cnblogs.com/xiaozengzeng/p/12094376.html

时间: 2024-10-05 05:01:46

Mysql千万级别数据批量插入,性能提高的相关文章

C#中几种数据库的大数据批量插入

C#语言中对SqlServer.Oracle.SQLite和MySql中的数据批量插入是支持的,不过Oracle需要使用Orace.DataAccess驱动. IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider.批量插入的实现可以通过实现该接口来实现. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatcherProvider : IProviderServic

C# 几种数据库的大数据批量插入

转载:http://www.cnblogs.com/luluping/archive/2012/08/09/2629515.html 在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summ

C#:几种数据库的大数据批量插入 - faib

在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatch

几种数据库的大数据批量插入【转】

在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatch

几种数据库的大数据批量插入

IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatcherProvider : IProviderService { /// <summary> /// 将 <see cref="DataTable"/> 的数据批量插入到数据库中.

MYSQL千万级数据表,创建表及字段扩展的几条建议

MYSQL千万级数据表,创建表及字段扩展的几条建议 一:概述 当我们设计一个系统时,需要考虑到系统的运行一段时间后,表里数据量大约有多少,如果在初期,就能估算到某几张表数据量非常庞大时(比如聊天消息表),就要把表创建好,这篇文章从创建表,增加数据,以及字段扩展,这几个方面来给出建议. 二:创建表 假如现在我们需要创建IM项目中的聊天消息表,这个表数据量大,读操作远超过写操作,我们都知道,mysql常用的数据库引擎主要有innodb,myisam,这两个数据库引擎主要区别是,innodb支持事务,

JDBC批量插入性能简单分析

批量插入性能分析:仅仅针对性能 1.使用Statement对象,一次一个,循环插入 2.使用PreparedStatement对象,一次一个,循环插入 3.使用PreparedStatement对象,使用addBatch(),executeBatch(),clearBatch()实现批量插入 注意事项: 1)数据库的驱动需要是5.1.37之后的版本,否则不支持批量操作 2)mysql数据库默认不开启批量操作,需要在数据库的url后面加上:?rewriteBatchedStatements=tru

数据批量插入MSSQL

MSSQL数据批量插入优化详细 序言 现在有一个需求是将10w条数据插入到MSSQL数据库中,表结构如下,你会怎么做,你感觉插入10W条数据插入到MSSQL如下的表中需要多久呢? 或者你的批量数据是如何插入的呢?我今天就此问题做个探讨. 压测mvc的http接口看下数据 首先说下这里只是做个参照,来理解插入数据库的性能状况,与开篇的需求无半毛钱关系. mvc接口代码如下: public bool Add(CustomerFeedbackEntity m) { using (var conn=Co

SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地址码 . FlightID Varchar(10) NULL, --航班号) 2/ 建立存储过程 USE DF17DataProIF EXISTS (SELECT * FROM SYS.PROCEDURES WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[BulkDataP