Java web 复制 上一年份的数据的功能,insert into select ... from ,结果 一个 仅有二十多条记录 的 备份,MySQL 执行 竟花费 将近 一分钟 时间
而 同样的SQL 在 Oarcle 下 执行 执行 几毫秒时间,我很是好奇 为何 在 两个不不同的数据库下,MySQL 居然 有这样的效率? 细细探究之
难道 是 UUID() 函数的使用?额外的索引? 还是 MySQL 引擎的问题?
mysql > set session BULK_INSERT_BUFFER_SIZE=256217728;
innodb_flush_log_at_trx_commit为0
auto_commit=0
Java web 复制 上一年份的数据的功能,insert into select ... from ,结果 一个 仅有二十多条记录 的 备份,MySQL 执行 竟花费 将近 一分钟 时间而 同样的SQL 在 Oarcle 下 执行 执行 几毫秒时间,我很是好奇 为何 在 两个不不同的数据库下,MySQL 居然 有这样的效率? 细细探究之难道 是 UUID() 函数的使用?额外
对于一些数据量较大的系统,面临的问题除了是查询效率低下,还有一个很重要的问题是
插入
时间长。我们有一个业务系统,每天的数据导入需要4-5个钟。这种费时的操作其实是很有风险的,假设程序出了问题,想重跑操作那是一件痛苦的事情。因此,
提高
大数据量系统的
MySQL
insert
效率是很有必要的。
经过对
MySQL
的测试,发现一些可以
提高
insert
效率的方法,供大家参考参考。
1、一条SQL语句
插入
多条数据。
常用的
插入
语句如:
INSERT
INTO `
insert
_table` (`datetime`, `uid`, `content`, `type`) VALUES (
`id` varchar(32) NOT NULL,
`name` varchar(32) DEFAULT NULL,
`role` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=
InnoDB
DEFAULT CHARSET=utf8;
INSERT
INTO `user` VALUES ('1', '1', '1');
INSERT
INT
作为一个Java后台,
MySQL
的使用是家常便饭,虽然平常不会遇到几十万甚至几百万的数据
插入
情况,但是耐不住我的好奇心,今天写几个方法用来测试一下
我们使用控制变量来对比出来最适合数据批量
插入
的条件
罗列一下条件(电脑硬件这种暂时改变不了):
插入
方法(循环
插入
、forEach
插入
、批处理)
数据库存储引擎(MyISAM、
InnoDB
)
先把测试结果放在这(单位:毫秒)
1.2 回表
假设我们执行一条查询语句
select
* from person where ID = 6,因为直接使用的是主键ID查询,所以就会用主键索引,由于主键索引直接关联了整行所有数据,所以,引擎只要执行一次就能查询出结果。
如果执行的sql语句是非主键索引
select
* f
但是
Mysql
不支持
select
into table,只支持
select
into var,因此要用create table tb as
select
* from xx where
两者之间存在很大的性能差异,是由于数据库的日志模式不一样,simple和完整模式会导致差异。
8万数据量,采用
insert
into 需要3秒左右,
select
* into 300毫秒。差十倍
案例描述在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,
mysql
会检测出死锁,并打印出日志。两个sql语句如下:(1)
insert
into backup_table
select
* from source_table(2)DELETE FROM source_table WHERE Id>5 AND titleWeight<32768 AND joinTime<‘$daysago_1week’teamUser表的表结构如下:PRIMARY KEY (`uid`,`Id`),KEY `k_id_titleWeight_score` (`Id`,`t
一、
innodb
行锁分类 record lock:记录锁,也就是仅仅锁着单独的一行 gap lock:区间锁,仅仅锁住一个区间(注意这里的区间都是开区间,也就是不包括边界值。 next-key lock:record lock+gap lock,所以next-key lock也就半开半闭区间,且是下界开,上界闭。 www.jb51.net next-key 锁定范围:(负无穷大,最小第一记录],(记录之间],(最大记录,正无穷大) 二、语句锁定情况分析
SELECT
… FROM … FOR UPDATE对读遇到的所有索引记录设置独占的next-key锁定。
INSERT
INTO … VAL
如果local_infile 被禁用,
InnoDB
中怎么
提高
insert
的效率呢?
1.尽量保持数据有序。减少数据
插入
时对索引的维护成本。
2.一次
插入
多条数据。减少日志,降低日志刷新磁盘的频率。减少sql解析次数。
3.在事物中进行
插入
。
减少事物创建的消耗。但也要控制事物的大小,最好不超过
innodb
_log_buffer_size。
SET autocommit=0;
INSER
原文:因用了
Insert
into
select
语句,同事被开除了!
Insert
into
select
请慎用,同事因为使用了
Insert
into
select
语句引发了重大生产事故,最后被开除。
某天 xxx 接到一个需求,需要将表 A 的数据迁移到表 B 中去做一个备份。他本想通过程序先查询查出来然后批量
插入
,但 xxx 觉得这样有点慢,需要耗费大量的网络 I/O,决定采取别的方法进行实现。
通过在某度的海洋里遨游,他发现了可以使用
insert
into
select
实现,这.