当前位置:首页 » 存储配置 » mysql存储过程批量插入

mysql存储过程批量插入

发布时间: 2023-05-28 04:39:50

‘壹’ 如何提升Mysql批量插入的效率

需要将大量数据(大概5W条)插入MySQL数
据库,用普通的SQL
Statement执行,时间大概是几分钟。于是想到用PreparedStatement,但是改了之后发现效率并没有很大的提升。不成,想到了
load data local
infile...命令,空渣粗以前一直认为这条命令仅限MySQL终端上使用而不是标准的SQL语句,今天看了几篇文章斗镇之后有了很大的收获。

1. 使用PreparedStatement batch operation

以前使用PreparedStatement性能梁携没有很大提升的原因在于:

没有使用批处理方法
在语句执行之前应关闭事务自动提交,语句执行完之后再提交

public
void batchLoad(Connection connection)

{

try
{

connection.setAutoCommit(false);

BufferedReader reader =
new BufferedReader(new
FileReader("tfacts_result"));

String sqlString =
"insert into test(node1, node2, weight) values(?, ?, ?)";

PreparedStatement pstmt = connection.prepareStatement(sqlString);

String line =
null;

while(true)

{

line = reader.readLine();

if(line == null)

{

break;

}

String[] columns = line.split("\t");

for(int
i = 1; i <= columns.length; i++)

{

pstmt.setString(i, columns[i-1]);

}

pstmt.addBatch();

}

pstmt.executeBatch();

connection.commit();

pstmt.close();

reader.close();

}
catch (FileNotFoundException e) {

e.printStackTrace();

}catch
(SQLException e){

e.printStackTrace();

}catch
(IOException e){

e.printStackTrace();

}

2.使用load data local infile into tabel XXX(注意在文件中用\t将每列数据隔开)

public
void loadData(Connection connection)

{

long
starTime = System.currentTimeMillis();

String sqlString =
"load data local infile ? into table test";

PreparedStatement pstmt;

try
{

pstmt = connection.prepareStatement(sqlString);

pstmt.setString(1,
"tfacts_result");

pstmt.executeUpdate();

pstmt.close();

}
catch (SQLException e) {

e.printStackTrace();

}

long
endTime = System.currentTimeMillis();

System.out.println("program runs "
+ (endTime - starTime) + "ms");

}

测试了5W条数据,PreparedStatement耗时10s,而load data infile耗时3s。

‘贰’ mysql批量插入数据

不用INSERTINTO难不成用UPDATE,数据导入3000条貌似不多吧


你要这么一说,还真有点难度了,因为数据类型不一样,还不能用数组,貌似没有什么绝窍

不过你可以直接用EXCEL中的CONCATENATE()函数把你的数据转换成SQL输入语句

然后把这个输入语句脚本放到一个文件中,如Iinsert.sql

接着用类似下面的代码把这个脚本导入MYSQL执行

php">!$db->select_db('databasename')&&exit($db->error());//选择当前数据库
if(!file_exists("./insert.sql"))exit("载入"insert.sql"失败!");
$import_sql=file_get_contents("pms.sql",dirname(__FILE__));//打开SQL文件并读取
$explode=explode(";",$import_sql);
$cnt=count($explode);
for($i=0;$i<$cnt;$i++){
!$db->query($explode[$i])&&exit("导入数据表失败!");
}
echo"已建立数据表...<br><br> ";

‘叁’ mysql存储过程怎样批量插入数据

一下代码运行通过:

delimiter$$;
createprocerelucia_proc16(countint)
begin
DECLAREname_procVARCHAR(20)CHARACTERSETutf8;
DECLAREsex_procVARCHAR(4)CHARACTERSETutf8;
DECLAREage_procINT(10);
DECLAREclass_procVARCHAR(20)CHARACTERSETutf8;
DECLAREAddr_procVARCHAR(50)CHARACTERSETutf8;
DECLAREiINT;
seti=1;
setsex_proc='女';
setage_proc=20;
setclass_proc='山治班';
setAddr_proc='北京市朝阳区';
whilei<countdo
setname_proc=CONCAT('露西亚',i);
insertintostudents(Name,Sex,age,class,Addr)values(name_proc,sex_proc,age_proc,class_proc,Addr_proc);
seti=i+1;
endwhile;
end
$$;
delimiter;

代码功能:

传入一个行数,控制插入多少条数据

运行效果:

‘肆’ c#中往mysql里批量插入上万条数据,有比较高效的方法吗

首先, 插入上万条数据,对于数据库来说并不是“很大”的工作量,一般配置的笔记本电脑都可以在1分钟内完成。 所以最简单、最灵活的办法还是写SQL语句。

如果不希望DB编译器每次执行都编译SQL的话,可以使用存储过程,直接调用,性能上会好很多。也比较简单。
(几万条数据怎么地也得要时间去处理,所以不可能特别快的。)

如果由于各种原因,导致这个插入还是很慢, 而且你的MYSQL又是5.0以上版本的话,可以使用BulkCopy来进行批量操作。
BulkCopy的原理就是Client直接把一个数组(DataTable)传给DB,然后传入表名,所有的编译、操作都由DB自己完成,效率很高。
引用MySql.Data.dll , 调用MysqlBulkCopy函数即可。

这个函数在处理海量数据插入的时候效率尤为明显, 小量数据反而没什么优势,而且由于传入的DataTable格式必须和表的字段一模一样(空的列也要传进去),导致C#要写很多代码来构造这个数组,所以要你自己权衡用还是不用。
我在自己的电脑上批量插入一亿条数据,Insert写法大概需要1小时,BulkCopy大概只需要5分钟。

‘伍’ mysql 怎么用insert批量插入数据

一次插入多行数据
insert
into
表名[(字段列表)]
values(值列表1),(值列表2),...(值列表n);
例如:
insert
into
students(sid,sname,dob)
values
('001','张三','2001-02-03'),
('002','李四','2002-02-03'),
('003','王五','2003-02-03');
将一张表或查询中的数据插入到另一张表里
insert
into
表名(字段列表)
select
(字段列表)
from
源表
where
筛选表达式;
例如将表2中的记录全部插入到表1,假设它们的结构一样
insert
into
表1(*)
select
*
from
表2;

‘陆’ mysql数据库如何批量插入数据,如有表A 字段id name password email 如何插入大批量会员

1.首先在命令行控制台中打开mysql教程
或许命令的如下:
mysql -u root -p database_name
然后或许会提示输入对应的密码
2.下面这条命令或许对你有用,当你想更换一个数据库姿隐教程的时候
mysql>use database_name
然后使用下面这个命令
mysql>source d:datafilename.sql
当然你并册键需要将文件所在的路径搞清楚,并且正确地使用了他
进入mysql 安装所在的目录的子目录bin. 输入执行导入sql的命令.
例如: 你的mysql 安装在 d:mysql
步骤如下:
开始 -> 运行 -> 输入CMD
D:
cd mysqlbin
mysql -u root -p123456 test <d:a.sql
其中 root 为你的mysql管理员用户名, 123456 为密码 test为数据库名称 d:a.sql 为备份下来的数据文件所在位置.
如果是Windows的话,从命令提示符下到MYSQL文件目录中的Bin文件夹下,执行命令
mysql -u root -p databasename < db.sql
其中root是你MYSQL的用户名,databasename是你数据库的名称,而db.sql你是的文件.注意你必须把db.sql放到bin文绝巧件夹下才可以.当然文件的位置可以换.
如果是LINUX的话,直接输入
mysql databasename < db.sql

‘柒’ 怎么用用mysql命令行快速插入一千条数据

先介绍一个关键字的使用:
delimiter 定好结束符为"$$",(定义的时候需要加上一个空格) 然后最后又定义为";", MySQL的默认结束符为";"
如何通过mysql命令行批量插入100条数据呢,可以在代码里实现,也可以通过命令行,也就是通过存储过程:

[java] view plain
delimiter $$
create procere myproc ()

begin
declare num int ;
set num = 1 ;
while num < 100 do
insert into emp (id, `name`, sex)
values
('', concat("name", num), 1) ;
set num = num + 1 ;
end
while ;

‘捌’ mysql批量插入死锁

你问的凳老是mysql批量插入死锁的原因吧?并发操作、数据库设计不合郑链理。
1、并发操作:当多个线程同时进行批量插喊粗孙入操作时会导致并发冲突从而引起死锁问题。
2、数据库设计不合理:表结构设计不合理,没有设置足够的索引或分区会导致死锁问题的发生。

‘玖’ mysql批量插入数据怎么写sql语句呢

如果就一个name字段并且ID是自增的话就这样
INSERT INTO tablename VALUES('name1','name2','name3','name4')
否则就这样
INSERT INTO tablename VALUES(('1','name1'),('3','name2'),('2','name3'),('8','name4'))
当然也可以这样写,上面的是简化的
INSERT INTO tablename (name)VALUES ('name1','name2','name3','name4')
INSERT INTO tablename (id,name) VALUES (('1','name1'),('3','name2'),('2','name3'),('8','name4'))

热点内容
流控脚本破解 发布:2025-02-07 08:39:09 浏览:413
什么是资源为什么要研究资源配置 发布:2025-02-07 08:25:19 浏览:87
钓鱼网站源码制作 发布:2025-02-07 08:23:54 浏览:139
mac运行fl需要什么配置 发布:2025-02-07 08:15:45 浏览:573
安卓怎么做都比不了苹果 发布:2025-02-07 08:12:47 浏览:238
怎么给物理机配置ip地址 发布:2025-02-07 08:01:37 浏览:139
三国志13未加密 发布:2025-02-07 07:54:37 浏览:926
马斯克中国访问 发布:2025-02-07 07:54:29 浏览:102
数据库有表 发布:2025-02-07 07:50:49 浏览:29
基于nginx搭建图片服务器原理 发布:2025-02-07 07:44:18 浏览:449