perlを使ってデータテーブル(mysql)を分割し、データインスタンスを移行する。
ビジネスが成長するにつれ、パフォーマンスを向上させるためにテーブルを分割することが必要になる場合があります。
以下は、www.jb51.net的users表拆分成10个表ttlsa_user_0-ttlsa_user_9 を分割する例です。
マイグレーションしたデータを分割する手順を以下に示します。
1. ttlsa_user_0-ttlsa_user_9テーブルを作成します。
#! /usr/bin/perl
###################################
### author: www.jb51.net ###
### QQ group: 232608061 ###
### E-mail: [email protected] ###
###################################
use DBI;
my $driver="DBI:mysql";
my $from_database="ttlsa";
my $from_user="root";
my $from_password="123456″;
my $from_host="localhost";
$from_dbh=DBI->connect ("$driver:$from_database:$from_host;user=$from_user;password=$from_password") or die "cannot connect: ". DBI->errstr;
for (0..9) {
$sql="CREATE TABLE `ttlsa_user_$_` (
`uid` int(10) NOT NULL AUTO_INCREMENT,
`email` varchar(50) NOT NULL,
`passwd` varchar(40) NOT NULL,
`user_name` varchar(20) NOT NULL,
PRIMARY KEY (`uid`),
UNIQUE KEY `email` (`email`),
UNIQUE KEY `user_name` (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT";
$from_dbh->do($sql);
}
$from_dbh->disconnect();
2. データの移行
#! /usr/bin/perl
###################################
### author: www.jb51.net ###
### QQ group: 232608061 ###
### E-mail: [email protected] ###
###################################
use DBI;
my $driver="DBI:mysql";
my $from_database="ttlsa";
my $from_user="root";
my $from_password="123456″;
my $from_host="localhost";
$from_dbh=DBI->connect ("$driver:$from_database:$from_host;user=$from_user;password=$from_password") or die "cannot connect: ". DBI->errstr;
$from_dbh->do("set names 'utf8′");
$from_dbh->do("set session autocommit=0″);
$from_dbh->do("set session unique_checks=0″);
$max=600000;
$step=10000;
for ($i=1;$i $step_i=$i+$step;
$sql="select * from ttlsa_users where user_id>=$i and user_id $sth=$from_dbh->prepare($sql);
$sth->execute;
@value=();
while ($row=$sth->fetchrow_hashref()) {
$uid=$row->{uid};
$email=$row->{email};
$passwd=$row->{passwd};
$user_name=$row->{user_name};
$key=substr($user_id,-1);
$value[$key]. = "('$uid','$email','$passwd','$user_name'),";
}
for (0..9) {
chop($value[$_]);
$sql="insert into ttlsa_user_$_ (`uid`,`email`,`passwd`,`user_name`) values" . $value[$_];
$from_dbh->do("$sql");
}
}
$from_dbh->do("set session autocommit=1″);
$from_dbh->do("set session unique_checks=1″);
$sth->finish();
$from_dbh->disconnect();
3. 付録
データ量がそれほど多くない場合は、テスト用に自由にデータを挿入してください。データ挿入のためのスクリプトを以下に用意しました。
#! /usr/bin/perl
###################################
### author: www.jb51.net ###
### QQ group: 232608061 ###
### E-mail: [email protected] ###
###################################
use DBI;
use Digest::SHA qw(sha1_hex);
my $driver="DBI:mysql";
my $from_database="ttlsa";
my $from_user="root";
my $from_password="123456″;
my $from_host="localhost";
$from_dbh=DBI->connect ("$driver:$from_database:$from_host;user=$from_user;password=$from_password") or die "cannot connect: ". DBI->errstr;
$from_dbh->do("set names 'utf8′");
$from_dbh->do("set session autocommit=0″);
$from_dbh->do("set session unique_checks=0″);
for (1..100000) {
$insert_sql=$from_dbh->prepare("insert into ttlsa_users (email,passwd,user_name) values (? ,? ,?)") ;
$email="auto-gre-$_\@jb51.net";
$data="auto-gre-$_";
$passwd=sha1_hex($data);
$user_name="auto-gre-$_";
$insert_sql->execute($email,$passwd,$user_name);
}
$from_dbh->do("set session autocommit=1″);
$from_dbh->do("set session unique_checks=1″);
$insert_sql->finish();
$from_dbh->disconnect();
関連
-
Perlのprint、printf、sprintfの使用例について説明します。
-
Perl一括で著作権情報を追加する
-
Perlグラフィカルパッケージ管理ツール PPMラーニングノート
-
PerlでローカルタイムからUNIXタイムスタンプに変換する方法
-
Perlの強力な正規表現の例を解説
-
Perlのコマンドラインプログラミングでよく使われるパラメータを1文にまとめたもの
-
PerlによるMSSQLへのアクセスとMySQLデータベースへの移行スクリプト例
-
Perlのハッシュの使い方チュートリアル
-
perlで2つのファイル文字列を比較するサンプルコード
-
[解決済み] Perlで整数の除算はどのようにすればよいのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン