2005-04-12  RDBMSその後―立ち位置が分からない編―

2月下旬に「某案件でDBを使うことになった」というお話をしました。その後,テーブルの仮設計が終わり(なぜ「仮」なのかは後述),DBにテストデータを挿入することになりました。巷の情報によると,DBに突っ込むテストデータは実際の運用で使うデータに近いものが良いそうです(ぜんぜん関係のないデータだと,DBの挙動が変わってしまうことがあるらしい)。そこで,わざわざ560万件の本物のレコードを用意しDBに入れてみました。余談ですが,560万件というのは実際の運用で使うレコードの約1/4の件数です。

さて,テストデータが入ってから「何件入っているか」を問い合わせてみたら,あまりに時間が掛かったもので焦りました。実際に「COUNT(*)」することがあるかはさておき,24秒では遅すぎる気がしたのです。「慌ててはダメ。そう,まだテーブルは仮設計なのよ。そういえばインデックスを作成していなかったわ。まず『id』にインデックスを作ってみましょう」と脳内でつぶやきながら,インデックスを作ってみました。

ところが処理を始めたのはよいのだが,ハードディスクがガーガー鳴ったまま一向に終わる気配がありませんでした。仕方がないので,某スポーツクラブで筋トレの真似をしてくることにしました。

mysql> select COUNT( * ) from tdb_his ;
+------------+
| COUNT( * ) |
+------------+
|    5602029 |
+------------+
1 row in set (24.56 sec)

mysql> CREATE INDEX id_idx ON tdb_his ( id ) ;
Query OK, 5602513 rows affected (1 hour 26 min 28.69 sec)
Records: 5602513  Duplicates: 0  Warnings: 0

筋トレの真似を終え戻ってみると,インデックスの作成は終わっていました。だいたい90分掛かったようです。私はモニターを眺めながら考えました。

  • インデックスの作成ってこういうものなのだろうか
  • さっきの件数のクエリの遅さといい,なんか鈍い気がする
  • いまは開発環境のマシンで動かしてるからじゃないの?本番のDBサーバは別物なんだから,もっと速く動くはず
  • プロセッサとHDDが速ければそれで解決できるのだろうか
  • そもそも560万件って多いの少ないの?2,000万件は裁けるの?
  • 私,この業界での立ち位置ってものが,まるで分かっていないのかもしれない(ふめい)

この段階で,O'Reillyの「実践ハイパフォーマンスMySQL」をいますぐ導入しなければ,この勝負に勝てないと悟りました。大急ぎでヨドバシカメラへ買いに行ってしまったのです(本を買えば済むという問題でもありませんが←なぞ)。

パラパラっとめくってみたのだが,アプリケーション(DBのクライアント)の種類によって,まずストレージエンジンとやらを選ばなければならないらしい。例えば,いまはInnoDBというやつを使っていたのだが(正確にはInnoDBだということすら知らなかったのだが),件数を数える類のクエリはMyISAMの方が速いそうです。

アプリケーションの挙動はテーブルの設計やSQL文が影響します。アプリケーション以外にもRDBMSの設定やソフトウェアを走らせるコンピュータ本体の性能も,システム全体に影響するのです。なんだか登場人物がいっぱいいるのでDBの業界って一朝一夕に最適な物が出来上がる,という性格のものではなさそうです。

DBを使い始めたもののまだ日が浅く,足元が覚束ない私ですが,これからどうなることやら。もっとも,いつものように何とかしますけどね。今までも何とかしてきたし(←なぜか余裕)。