mysqlの最近のブログ記事

よーは、適当にインストールしてしまった、MT&MySQLだったので、

latin1のままだったのですが、他のアプリから、デフォルトUTF-8で

接続したかったため、変更しましたよーってこと

まずは、MySQLの状態確認

 

# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.51a-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> STATUS;
--------------
mysql  Ver 14.12 Distrib 5.0.51a, for redhat-linux-gnu (i686) using  EditLine wrapper

Connection id:          1
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.51a-log Source distribution
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
UNIX socket:            /tmp/mysql.sock
Uptime:                 4 sec

Threads: 1  Questions: 4  Slow queries: 0  Opens: 12  Flush tables: 1  Open tables: 6  Queries per second avg: 1.000
--------------

 

latin1のことを確認したら、バックアップを取りましょー

 

# mysqldump -uroot -p modperl --default-character-set=latin1 > modperl.latin1.db

 

んで、もってUTF-8にテーブルを変える

 

# sed -s 's/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/' modperl.latin1.db > modperl.utf8.db

 

んで、入れる

 

mysql -uroot -p modperl < modperl.utf8.db

 

んで、MySQLのmy.cnfに以下を追加してrestart

 

/etc/my.cnf
 [client]
 default-character-set = utf8
 [mysqld]
 default-character-set = utf8
 [mysql]
 default-character-set = utf8

 

ほいで、状態を確認する

 

# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.51a-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> STATUS;
--------------
mysql  Ver 14.12 Distrib 5.0.51a, for redhat-linux-gnu (i686) using  EditLine wrapper

Connection id:          2
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.51a-log Source distribution
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /tmp/mysql.sock
Uptime:                 25 sec

Threads: 1  Questions: 91  Slow queries: 0  Opens: 24  Flush tables: 1  Open tables: 18  Queries per second avg: 3.640
--------------

 

パチパチ、めでたしめでたしって、思って

MTの管理画面をリロードしたら、文字化けしやがってる!!

 

なんで??

 

MyBenchっていーのは、MySQLのベンチマークをとるものです

サイトは、こちら

http://jeremy.zawodny.com/mysql/mybench/

 

作者は、下↓の著者でもありますね

 

 

ともかく、実際に起動してみましょー

 

ダウンロードしたターボールを、tar zxvfして、展開

perl Maikfile.PL と make でインストール完了!!

 

bench_exampleってのをちょこっとだけ変更するだけですな

 

ということで、人力検索に答えようとしたら、一人1回のため、

こっちに書いてみますw

 

元質問はこっちですよ

http://q.hatena.ne.jp/1233674997

 

結局は、フルレプリケーションした場合は、どーしよーもない感じですが、

あるDBをスレーブしてるなどの負荷を分散する際は、こんなのが使えました

 

マスターにて

 

mysql>USE test;
mysql>CREATE TABLE xxx ENGINE=MyISAM;
mysql>USE mysql;
mysql>ALTER TABLE test.xxx ENGINE=InnoDB;

 

はてさて、同じことやってるみたい?

分かる人は分かったかな?

 

質問は、こちら

 

やったことは、まず3テーブル作る

 

CREATE TABLE tb1 (id INTEGER AUTO_INCREMENT, PRIMARY KEY(id));
CREATE TABLE tb2 (id INTEGER AUTO_INCREMENT, PRIMARY KEY(id));
CREATE TABLE tb3 (id INTEGER AUTO_INCREMENT, PRIMARY KEY(id));

 

適当にデータを入れたところで、以下のクエリーでEXPLAINしてみる

 

EXPLAIN SELECT tb1.* FROM tb1 LEFT JOIN tb2 ON tb1.id = tb2.id LEFT JOIN tb3 ON tb1.id = tb3.id WHERE tb1.id = '6';

 

結果は

 

+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra                |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------------------+
|  1 | SIMPLE      | tb1   | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index          |
|  1 | SIMPLE      | tb2   | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index          |
|  1 | SIMPLE      | tb3   | const | PRIMARY       | PRIMARY | 4       | const |    0 | unique row not found |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------------------+
3 rows in set (0.00 sec)

 

うーん、問題なくINDEXを使ってるなー

 

かなり負荷がかかるとは、どういうことなんでしょう・・・

 

こんな素敵なサイトを見つけましたww

 

InnoDB vs MyISAM パフォーマンス比較 DELETEとINSERT

 

いやはや、ためになります

 

ということで、実際にinnodbと、myisamで実験開始!!

 

実験サーバスペック

 

Intel(R) Celeron(R) CPU 2.93GHz
Memory 1GB

 

使ったのは、この2つのテーブル

 

mysql> SHOW CREATE TABLE innodb_test\G
*************************** 1. row ***************************
       Table: innodb_test
Create Table: CREATE TABLE `innodb_test` (
  `id` int(11) NOT NULL auto_increment,
  `string` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> SHOW CREATE TABLE myisam_test\G
*************************** 1. row ***************************
       Table: myisam_test
Create Table: CREATE TABLE `myisam_test` (
  `id` int(11) NOT NULL auto_increment,
  `string` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

 

レコード数は、2テーブルともに100万件です

 

mysql> SELECT SQL_NO_CACHE COUNT(id) FROM innodb_test;
+-----------+
| COUNT(id) |
+-----------+
|   1000000 |
+-----------+
1 row in set (4.40 sec)

mysql> SELECT SQL_NO_CACHE COUNT(id) FROM myisam_test;
+-----------+
| COUNT(id) |
+-----------+
|   1000000 |
+-----------+
1 row in set (0.00 sec)

 

ちなみに、100万件投入したPerlスクリプトはこれ

 

#!/usr/bin/perl

use strict;
use warnings;
use String::Random;
use DBI;

my $dbh = DBI->connect('DBI:mysql:test2', 'user', 'pass');
my $str = String::Random->new();
my $sth = $dbh->prepare('INSERT INTO innodb_test(string) VALUES(?)');

for (1..1000000) {
    my $rnd = $str->randregex('.{128,255}');
    $sth->execute($rnd);
}
$sth->finish();
exit;

 

128~255byteまでのランダムな文字列を入れる簡単なスクリプトです

 

ふと気になったので、試してみました

 

mysql> show create table myisam_test\G
*************************** 1. row ***************************
       Table: myisam_test
Create Table: CREATE TABLE `myisam_test` (
  `id` int(11) NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

 

 

mysql> show create table innodb_test\G
*************************** 1. row ***************************
       Table: innodb_test
Create Table: CREATE TABLE `innodb_test` (
  `id` int(11) NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

 

 

いやはや、この2週間、かなり仕事が忙しくて

 まったくブログが書けませんでした・・・orz

 

とりあえず、前に言ってた「A5:SQL」で、このサイトのER図を

 リバースしてみました

 

簡単にER図を書きたくて、いろいろ探していたらありました♪

 

A5:SQL Mk-2

 

リバースエンジニアリングとかもできるから、

このサイトのDB構成でも、今度のっけときますww

結構使った感じは、いい感じ~

 

MySQL Workbench は、使ってないけど、結構重いという噂があったので・・・

事実関係は不明なので、みなさん両方試してみてくださいな♪

 

せっかく、perlの排他制御とか書いたので

mysqlも書いてみようとおもふ

 

まずは、プロンプトを2つ開いて、以下のコマンドを両方に打つ

 

mysql> SET AUTOCOMMIT = 0;
mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 

そんでもって、1つ目のwindowで以下のように打つ

ちなみに、list2テーブルの中身はこんな感じ

 

mysql> SELECT * FROM list2;
+----+------+
| id | memo |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
+----+------+
3 rows in set (0.01 sec)

 

では、Lockをっ!!

 

Perl 勉強本

Oracle 勉強本

J2EE 勉強するなら、これしかなくね?

ブログ管理人

SE perler@29

アイテム

  • image001.gif
  • modperl.png

アドパートナー

tooland

Pingo!

boox