読者です 読者をやめる 読者になる 読者になる

harry’s memorandum

おれおれメモ

MySQL性能テストのためのゴミデータ作成

mysqlに1000万件のゴミデータをインサートするために、ゴミコードを書いた。

環境

  • os:centos5.2(xen-domain-u)
  • memory:2GB

ruby/mysqlインストール

configを指定してインストールします。

$ sudo yum install ruby ruby-devel mysql-server mysql-devel mysql
$ sudo gem install mysql -- --with-mysql-config=/usr/bin/mysql_config

DB作成

適当にDBを作成。

CREATE TABLE `users` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `user` varchar(64) default NULL,
  `misc1` varchar(64) default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `users` (`user`)
)

1000万件インサート

bulkインサートにしてみた。

require 'rubygems'
require 'mysql'

def misc1
  str = (1..16).inject(String.new){|s,stub| s << format("%02x",rand(255)).to_s }
  "#{str[0,8]}-#{str[8,4]}-#{str[12,4]}-#{str[16,4]}-#{str[18,12]}"
end
def user(num)
  "foo" + num.to_s
end

max=10000000
bulk = []
db = Mysql::new("localhost","root","","perftest")
(1..max).each {|n|
  unless n % 1000 == 0
    bulk << "\(\'#{user(n)}\', \'#{misc1}\'\)"
  else
    db.query("insert into `users` (`user`, `misc1`) value #{bulk.join(',')}")
    puts n.to_s
    bulk.clear
  end
}

1時間半ぐらいでやっと終わり。DBのサイズは1.3GB前後になりました。

$ time ruby test.rb 
real    55m48.440s
user    31m16.565s
sys     5m30.345s

$ sudo du -sh `pwd`
1.3G    /var/lib/mysql