perl dbi mysql 向表中插入数据速度很慢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了perl dbi mysql 向表中插入数据速度很慢相关的知识,希望对你有一定的参考价值。

我想读入一些文件,从每行中提取一些信息插入到mysql表中,但下面的代码在windows下运行速度很慢,5000行的文件要2分钟多才插入完成,
请问怎样才能提高速度?
说明:
1:同样的代码在linux(ubuntu)下只要1秒左右
2:不考虑用LOAD DATA INFILE 的方法(行的内容要做些处理,用此方法需要生成临时文件)

下边是程序的结构
#!/usr/bin/perl -w
use strict;
use DBI;
my @filename=glob"*.txt";
my $dbh=DBI->connect("dbi:mysql:annotation","root","123456")||die "$DBI::errstr";
my $ImportData=$dbh->prepare("INSERT INTO test(id,name,v1,v2,v3,v4,v5) VALUES (?,?,?,?,?,?,?)");
foreach my $filename(@filename)
open(IN,"<$filename");
while(<IN>)
chomp;
my @temp=split(/\t/);
$ImportData->execute(temp[0],$temp[1],$temp[2],$temp[3],temp[4],$temp[5],$temp[6]);

参考技术A DBI默认是自动commit的。
因此,你循环里面的
$ImportData->execute(temp[0],$temp[1],$temp[2],$temp[3],temp[4],$temp[5],$temp[6]);
每插一行,就commit一次,效率就很差了。

1.在连接库后,禁用自动commit:
$dbh->AutoCommit = 0;

2. 控制commit频度:
$ImportData->execute(temp[0],$temp[1],$temp[2],$temp[3],temp[4],$temp[5],$temp[6]);
$i++;
$dbh->commit() if $i % 1000==0; #插1000行,commit一次

然后,你就会体会到飞一般的感觉
参考技术B 同样的程序、同样的数据,运行速度是环境决定的,Windows在大型数据吞吐方面肯定比不上Linux的。

另外你需要注意点,插入数据库的语句一般会随着数据库里面的数据的增加而减慢,如果向一个空库插入一条数据,肯定一瞬间就完成了,而向一个拥有庞大数据的表里面插入,可能会需要很久。你比较两个系统的速度,应该是具有相同的初始数据量。

此外影响插入速度的数据库表的索引,一般说来索引越少插入就越快,在大量数据插入前,可以删除索引。

解决MySQL向表中增加数据插入中文乱码问题

文章目录


前言

在命令行使用MySQL创建表后向表中增加数据时出现的中文乱码问题,我安装的MySQL版本是MySQL 5.7,在MySQL 8.0版本之后的不会出现这种问题,所以这是基于MySQL 5.7版本而言的

mysql> insert into student values(1002,'张三');
ERROR 1366 (HY000): Incorrect string value: '\\xD5\\xC5\\xC8\\xFD' for column 'name' at row 1

一、为什么会出现这种ERROR

这是源于MySQL中默认的字符集是Latin1所致,当我们使用中文添加入表中时就会出现中文乱码,从而报错,产生ERROR

二、解决步骤

1:查看编码命令

在命令行中使用如下命令

show variables like 'character_%';
show variables like 'collation_%';

2.修改MySQL的数据目录下的my.ini配置文件

修改配置文件使用高级文本编辑器,我这里使用的是Sublime Text 3,使用记事本等软件打开修改后可能会导致文件编码修改为“含BOM头”的编码,从而服务重启失败。

default-character-set=utf8 #默认字符集
[mysqld] # 大概在76行左右,在其下添加
...
character-set-server=utf8
collation-server=utf8_general_ci

3.重启MySQL服务

这里可以手动关闭或者使用命令行来重启MySQL服务,下图是使用命令行重启MySQL服务

4.重新查看编码命令

继续在命令行中使用如下命令

show variables like 'character_%';
show variables like 'collation_%';

5.重新向表中添加中文数据

注意

这里要注意噢,要注意之前创建的表的字符集是Latin1,所以在添加中文的时候会报ERROR,这里的解决方法就是直接删除数据库,重新创建库,默认的就是utf8啦

重新创建数据库

重新创建表后向表中添加中文数据


总结

以上就是解决MySQL向表中增加数据插入中文乱码问题,仅针对MySQL 5.7 版本,MySQL 8.0版本默认的字符集就是utf8,可以直接向表中插入中文数据。原理还是修改字符集的默认方式,utf8字符集。
如果遗忘修改默认的编码,就会出现乱码的问题。从MySQL 8.0开始,数据库的默认编码改为 utf8mb4 ,从而避免了上述的乱码问题。

以上是关于perl dbi mysql 向表中插入数据速度很慢的主要内容,如果未能解决你的问题,请参考以下文章

Mysql向表中循环插入数据

如何使用mysql语句向表中插入数据

Perl/DBI/FreeTDS/SQLAzure 一些插入被忽略

向表中添加了新列并减慢了整个数据库的速度。为啥?

如何向表中插入数据以及如何更新删除表中的数据

Perl 和 MySQL - 使用 DBI 从表的最后一行返回字段,可能带有 last_insert_id?