mysql - 如何优化在数据库中执行 INSERTS 的脚本?
问题描述
所以我已经完成了一个脚本,它将数据插入 mysql 表并将这些文件移动到一个目录中,直到所有文件都没有。大约有 51 个文件,完成执行大约需要 9 秒。所以我的问题是。有没有更好的方法来加快执行过程?
代码是
our $DIR="/home/aimanhalim/LOG";
our $FILENAME_REGEX = "server_performance_";
# mariaDB config hash
our %db_config = ( "username"=>"root", "password"=> "", "db"=>"Top_Data", "ip" => "127.0.0.1", "port" => "3306");
main();
exit;
sub main()
{
my $start = time();
print "Searching file $FILENAME_REGEX in $DIR...\n";
opendir (my $dr , $DIR) or die "<ERROR> Cannot open dir: $DIR \n";
while( my $file = readdir $dr )
{
print "file in $DIR: [$file]\n";
next if (($file eq ".") || ($file eq "..") || ($file eq "DONE"));
#Opening The File in the directory
open(my $file_hndlr, "<$DIR/$file");
#Making Variables.
my $line_count = 0;
my %data = ();
my $dataRef = \%data;
my $move = "$DIR/$file";
print "$file\n";
while (<$file_hndlr>)
{
my $line = $_;
chomp($line);
print "line[$line_count] - [$line]\n";
if($line_count == 0)
{
# get load average from line 0
($dataRef) = get_load_average($line,$dataRef);
print Dumper($dataRef);
}
elsif ($line_count == 2)
{
($dataRef) = get_Cpu($line,$dataRef);
print Dumper($dataRef);
}
$line_count++;
}
#insert db
my ($result) = insert_record($dataRef,\%db_config,$file);
my $Done_File="/home/aimanhalim/LOG/DONE";
sub insert_record(){
my($data,$db_config,$file)=@_;
my $result = -1; # -1 fail; 0 - succ
# connect to db
# connect to MySQL database
my $dsn = "DBI:mysql:database=".$db_config->{'db'}.";host=".$db_config->{'ip'}.";port=".$db_config->{'port'};
my $username = $db_config->{'username'};
my $password = $db_config->{'password'};
my %attr = (PrintError=>0,RaiseError=>1 );
my $dbh = DBI->connect($dsn,$username,$password,\%attr) or die $DBI::errstr;
print "We Have Successfully Connected To The Database \n";
$stmt->execute(@param_bind);
****this line is insert data statement***
$stmt->finish();
print "The Data Has Been Inserted Successfully\n";
$result = 0;
return($result);
# commit
$dbh->commit();
# return succ / if fail rollback and return fail
$dbh->disconnect();
}
exit;
已编辑
所以这几乎是我的代码,到处都是狙击。
我试图将“insert_record”放在评论#insert db 下方,但我认为这无济于事:U
解决方案
您正在为要插入的每个文件连接到数据库(如果我正确阅读了您的代码,似乎缺少一个右大括号,它实际上不会编译)。打开新的数据库连接(相对)很慢。
在插入第一个文件之前打开连接一次,然后将其重新用于后续插入数据库中。将最后一个文件插入数据库后关闭连接。这应该会给你一个明显的加速。
(根据数据量,9 秒实际上可能还不错;但由于没有这方面的信息,所以很难说)。
推荐阅读
- python - 如何使用图例点击策略在 Python Bokeh 图中隐藏线和圆?
- python - 改组长数组python的快速方法
- react-native - 当prop在React Native Navigation中更改其值时如何更新初始参数
- python - 从日期到元组 Python
- matlab - sympref --- 'MatrixWithSquareBrackets' 不起作用
- python - 由于软件包版本为 0,无法推送到 Heroku
- javascript - Angular 9“没有 ControlContainer 的提供者”VSCode 错误,带有嵌套的表单生成器表单组
- html - 移动浏览器中的后台行为异常
- bash - 在 shell osascript 命令中的“”之间插入一个变量?
- jquery - jQuery - 禁用选择选项