use Benchmark ":hireswallclock"; use DBI; use POSIX qw( floor ); use Getopt::Long; $opt_loop_count=100000; # number of loops(rows) $random_loop_count=$opt_loop_count; $table_name="bench4"; $opt_db_host="localhost"; $opt_db_socket="/tmp/mysql.sock"; $opt_db_name="test"; $opt_db_engine="Maria"; $opt_rows=50000; GetOptions("rows=s","db-socket=s","db-engine=s"); $dbh = DBI->connect("dbi:mysql:$opt_db_name;host=$opt_db_host;mysql_socket=$opt_db_socket","root","") or die $DBI::errstr; $sth = $dbh->prepare("select VERSION()") or die $DBI::errstr; $version="MySQL ?"; if ($sth->execute && (@row = $sth->fetchrow_array)) { $row[0] =~ s/-/ /g; $version="MySQL $row[0]"; } $sth->finish; print "$version, ENGINE: $opt_db_engine \n"; print "Generating random keys\n"; $random[$random_loop_count]=0; for ($i=0 ; $i < $random_loop_count ; $i++) { $random[$i]=$i; } my $tmpvar=1; for ($i=0 ; $i < $random_loop_count ; $i++) { $tmpvar^= ((($tmpvar + 63) + $i)*3 % $random_loop_count); $swap=$tmpvar % $random_loop_count; $tmp=$random[$i]; $random[$i]=$random[$swap]; $random[$swap]=$tmp; } sub random { my $i = shift; $i += $opt_loop_count; return $random[$i % $random_loop_count] + floor($i/$random_loop_count)*$random_loop_count; } $create_table_bench1="CREATE TABLE $table_name ( field1 tinyint(4) NOT NULL, field_search tinyint(4) NOT NULL, field2 mediumint(9) NOT NULL, field3 smallint(6) NOT NULL, field4 char(16) NOT NULL, field5 int(11) NOT NULL, field6 float NOT NULL, field7 double NOT NULL, field8 char(6) NOT NULL, field9 char(6) NOT NULL, field10 char(6) NOT NULL, field11 char(6) NOT NULL, field12 char(6) NOT NULL, field13 char(6) NOT NULL, field14 char(6) NOT NULL, field15 char(6) NOT NULL, field16 char(6) NOT NULL, PRIMARY KEY (field1,field2,field3,field4,field5,field6, field7,field8,field9,field10,field11,field12, field13,field14,field15,field16), KEY index2 (field_search), KEY index3 (field3), KEY index4 (field4), KEY index5 (field5), KEY index6 (field6), KEY index7 (field7), KEY index8 (field8), KEY index9 (field9), KEY index10 (field10), KEY index11 (field11), KEY index12 (field12), KEY index13 (field13), KEY index14 (field14), KEY index15 (field15), KEY index16 (field16) ) ENGINE=$opt_db_engine"; $dbh->do("drop table if exists $table_name"); $dbh->do($create_table_bench1); $many_keys_loop_count=20000; @types=(0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1); print "Inserting $opt_rows rows\n"; { $query_size=1000000; $query="insert into $table_name values "; $res=$query; for ($i=0; $i < $opt_rows; $i++) { $id= $i & 127; $rand=&random($i); $tmp="($id,$id,$rand," . ($i & 32766) . ",'ABCDEF$rand',0,$rand,$rand.0,"; for ($j=8; $j <= 16 ; $j++) { $tmp.= ($types[$j] == 0) ? "$rand," : "'$rand',"; } substr($tmp,-1)=")"; if (length($tmp)+length($res) < $query_size) { $res.= $tmp . ","; } else { $sth = $dbh->do(substr($res,0,length($res)-1)) or die $DBI::errstr; $res=$query . $tmp . ","; } if (floor($i/1000)==$i/1000) { print "Inserted $i rows\n"; } } $sth = $dbh->do(substr($res,0,length($res)-1)) or die $DBI::errstr; } print "Start delete data\n"; for ($i=0 ; $i < 128 ; $i++) { $count++; $dbh->do("delete from $table_name where field_search = $i") or die $DBI::errstr; }