MySQLの最近のブログ記事

MySQLの能力

| コメント(0) | トラックバック(0)

前回のエントリーに書いた、吉岡さんの言葉に
触発されてこんなエントリを書いてみることにした。

現在のうちで使われている環境の実績値である。

・サーバースペック
AMD Opteron x 2
HDD RAID5
MEMORY 4G

・OS
64bit Linux

・MySQL 5.0系

64bit独自ビルド

このようなサーバーで動いている。
ごく普通のIAサーバーだと思う。
大体イメージはつくのではないだろうか。

このDBはショートトランザクションが多い
典型的なWeb-DbシステムのBackEndDBだ。
因みにWebサーバーは16台だったと思う。

コネクションという切り口だけであるが
先月の実績値を抽出してみた。(ログに残ってた分だけ。)

日別接続総数

日付 接続数
2008-05-06 812182
2008-05-07 639833
2008-05-08 699873
2008-05-09 864579
2008-05-10 1059060
2008-05-11 977823
2008-05-12 735684
2008-05-13 786287
2008-05-14 816966
2008-05-15 814209
2008-05-16 883834
2008-05-17 998514
2008-05-18 870545
2008-05-19 691247
2008-05-20 766734
2008-05-21 792294
2008-05-22 832096
2008-05-23 987512
2008-05-24 1044829
2008-05-25 923986
2008-05-26 781597
2008-05-27 823865
2008-05-28 862186
2008-05-29 75860

秒間最大接続数

日付 接続数
2008-05-16 19:07:44 66
2008-05-17 18:13:08 65
2008-05-10 18:10:23 64
2008-05-10 18:34:20 63
2008-05-24 17:48:20 58
2008-05-24 18:06:59 57
2008-05-23 19:03:26 56
2008-05-10 18:34:10 56
2008-05-10 18:08:37 55
2008-05-23 18:46:28 55

先月の日別の接続数と瞬間最大風速のコネクション数である。
ログに出力しているのでMySQLに対する本当の
意味での接続数である。

以前はレプリケーションを使った分散DBで10台程度で捌いていたのだが
一台でも捌き切りそうだと判断できたので
集約してしまった。半年以上たつが問題は起きていない。

今回集計してみて思ったより出ていないと思ったのだが
これはDBが問題なのかWebサーバーが問題なのかは
まだ切り分け出来ていない。

※箱に対する突込みどころ満載振りは承知で。
ここのコントロールできないんだよなぁ。

虚に入りがちで忘れやすいInnoDBに対する制限。

The maximum row length, except for VARCHAR, BLOB and TEXT columns, is slightly less than half of a database page. That is, the maximum row length is about 8000 bytes. LONGBLOB and LONGTEXT columns must be less than 4GB, and the total row length, including also BLOB and TEXT columns, must be less than 4GB. InnoDB stores the first 768 bytes of a VARCHAR, BLOB, or TEXT column in the row, and the rest into separate pages.

テキスト型及びBLOB型及びVARCHAR型を除く一行の総バイト数は
8000バイトまで。テキスト型及びBLOB型及びVARCHAR型は
それ以上格納できるが行最初の768バイト迄は他の型と
同じところに格納する為、合計値8000バイトを超えられない。
つまりVARCHAR型だけで長さ100のカラムを作ると80個迄しか
作成できない。

ポイントは文字コードをマルチバイトにしているとテーブルは
作成できてもデータは格納できない条件が在り得る事。

CREATE TABLE t1 (
c1 VARCHAR(100),
c2 VARCHAR(100),
...
c39 VARCHAR(100),
c40 VARCHAR(100)
) ENGINE = InnoDB DEFAULT CHARSET latin1;

この場合総文字列長しては4000バイトの為作成可能。

CREATE TABLE t1 (
c1 VARCHAR(100),
c2 VARCHAR(100),
...
c39 VARCHAR(100),
c40 VARCHAR(100)
) ENGINE = InnoDB DEFAULT CHARSET utf8;

この場合総文字列長は理論上(UCS-4の場合) 4×100x40 = 16000バイト
(厳密に言うと理論値では6×100x40 = 24000バイト)
格納できる事となり8000バイトを超えてしまう。
間違っていたので訂正。
この場合総文字列長は理論上3×100x40=12000バイト格納できることとなり 8000バイトを超えてしまう。
(※MySQLのUTF8は3バイト文字までしか対応していない。)

この為、テーブルの作成は出来てもインサートエラーとなってしまうので
気をつける必要がある。

もっとも、このようなテーブルの場合テーブル定義を見直すのが
第一だと思うけれども。

ウェブページ