今回は,MySQLのチューニングを解説する。この連載でもすでに一度,MySQLのチューニングを紹介したことがある(第8回 MySQLチューニングのテクニック)。このときは,SQLステートメントやテーブルそのものを高速化するためのテクニックを取り上げている。これは,サーバーの設定では,対応できない場合のテクニックだ。今回は,初心に帰る意味でも最初に検討すべき,サーバーの設定に関して取り上げる。

MySQLサーバーの状況確認

 なぜ,今回このようなテーマを選んだかというと,MySQLをインストールしたままで使用しているユーザーがかなりいることに気が付いたからだ。MySQLは,他のデータベースと比較すると設定が少なくても高速に動作すると言われている。その手軽さが大きな魅力となっている。しかし,これは,小規模を前提にしている。大規模な処理を行うサーバーは,それなりに強力なスペックを持っている。このスペックに合ったパフォーマンスを発揮するためにもサーバー設定を行う必要がある。

 MySQLサーバーの状況を確認するには,いくつかのコマンドがある。それぞれ表示される内容が大きく異なるため,用途に応じて使い分けることをお勧めする。

 以下に示すリストはサンプルであり,多くがデフォルト状態での実行例となっている。

サーバー起動時の設定確認

 MySQLサーバーの起動時設定を確認するには,mysqldのパラメータに--helpを追加して実行する。すると,リスト1のようなメッセージを表示する。


リスト1●mysqld --helpの出力例

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- -----------------------------
basedir                           C:/mysql
bdb-home                          (No default value)
bdb-logdir                        (No default value)
sync-bdb-logs                     TRUE
bdb-tmpdir                        (No default value)
(以下省略。[全体表示])

 mysqld --helpによる表示は,起動時にしか設定できないシステム変数を確認するときに使用する。

クライアントとの接続状況の確認

 statusコマンドでは,クライアントとMySQLサーバーの接続に関する情報を表示する。MySQLサーバーの状態を確認する意味で,手軽なコマンドである。


リスト2●statusコマンドの出力例
mysql> status
--------------
mysql  Ver 12.22 Distrib 4.0.23, for Win95/Win98 (i32)

Connection id:          6
Current database:
Current user:           root@localhost
SSL:                    Not in use
Server version:         4.0.23-nt
Protocol version:       10
Connection:             localhost via TCP/IP
Client characterset:    latin1
Server characterset:    latin1
TCP port:               3306
Uptime:                 1 hour 4 min 5 sec

Threads: 2  Questions: 122  Slow queries: 0  Opens: 11  Flush tables: 1
  Open tables: 5  Queries per second avg: 0.032

 よく文字化けに関するトラブルを耳にする。この場合,まずはstatusコマンドで,文字コードの設定を確認することをお勧めする。サーバーの文字コードを確認した上で,意図していない文字コードになっていないか確認できる。

MySQLサーバー統計情報

 show statusコマンドは,MySQLサーバーの状況をレポートする。このコマンドで表示される情報には,大きく分けて2つの種類がある。「Open_tables」と「Opened_tables」を例にして解説する。

 「Open_tables」は,現在開いているテーブル数を表す。これは,現時点の状態を表すものだ。

 それに対して「Opened_tables」は,サーバーが稼働してからオープンしたテーブルの総数を表す。このように過去形の項目は,統計(累積)情報なのである。


リスト3●show statusコマンドの出力例
mysql> show status;
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Aborted_clients          | 0     |
| Aborted_connects         | 3     |
| Bytes_received           | 15368 |
| Bytes_sent               | 17400 |
(以下省略。[全体表示])

MySQLサーバーの全設定情報

 show variablesコマンドは,MySQLサーバーに設定されているシステム変数すべてを表示する。


リスト4● show variablesコマンドの出力例

mysql> show variables;
+---------------------------------+------------------------------------------+
| Variable_name                   | Value                                    |
+---------------------------------+------------------------------------------+
| back_log                        | 50                                       |
| basedir                         | C:\Program Files\MySQL\MySQL Server 4.1\ |
| binlog_cache_size               | 32768                                    |
(以下省略。[全体表示])