Webアプリケーションでは、とにかくレスポンスタイムが重要になります。レスポンスタイムはユーザーの使い勝手に直結しますし、あまりにレスポンスが悪いとユーザーはページのリロードを試みます。つまり、トラフィックがさらに増えるわけで、サチュレーション*が起こってしまうのです。これを避けるためには、基本的なレスポンスタイムを低く抑える必要があります。
そのためWebアプリケーション開発者の間では、データアクセスのスケーラビリティ確保がよく話題に上ります。大規模サイトに使われるようなWebアプリケーションであれば、ストレージへのアクセス手段としてRDBMSが使われており、特にOSSのRDBMSであるMySQLやPostgreSQLのチューニング方法がよく議論されます。
しかし、結局のところ、「インデックスを正しく利用する、パラメータを正しく設定する」などという基本的な対策ができているならば、その次にやるべきことはディスクI/Oにかんするものがほとんどです。ある程度チューニングしてみて、それでもレスポンスタイムが十分低く抑えられない場合は、
という2点が基本原則となってきます。
具体的には1の対策は、大量のメモリを積んだマシンを用意することを意味しますので、予算的な問題さえ解決できれば難しいことではありません。しかし、予算の都合は必ず存在しますし、データは無限に増え続けるので、いつでもこの方法が使えるわけではありません。エンジニアリング的解決法としては、2の方法が有効です(コラム2)。以下では、データ分割の手法について説明しましょう。
大規模サイトの運営に当たって問題を解決していくというのは、実にさまざまな選択肢の中から1つの手法を選ぶことです。資金に余裕があれば、高価なハードウェアを投入することで多くの問題を解決できますし、逆に強力なエンジニアリングパワーがあれば、資金がなくてもソフトウェアでもさまざまな問題を解決できます。
また、問題が起こったときに「解決のためのコストを割けない、やる気がない」という場合には、そのアプリケーションやサイトを売却してビジネス的なゴールとすることも当然可能です(この場合、ちょっと違ったスキルが必要となりますが)。
重要なのは、開発チームや会社として、ある程度基本的なスタンスを決めておくことだと考えられます。例えばGREEでは現在のところ、
というスタンスで問題解決の方法を考えています。
データの分割手法として、データベーステーブルに含まれるテキスト型のフィールドを別のストレージ、あるいは別のサーバに分離するという方法があります。例えばブログのデータを保存するための、リスト1のようなスキーマを持つテーブルがあるとします。
blogテーブル:
+----------------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+----------+------+-----+---------+-------+
| id | int(11) | | | 0 | |
| user_id | int(11) | YES | | NULL | |
| publication_datetime | datetime | YES | | NULL | |
| title | text | YES | | NULL | |
| content | text | YES | | NULL | |
+----------------------+----------+------+-----+---------+-------+
このとき、titleとcontentフィールドがWHERE句*の条件となることはまずありません。非常に小規模なアプリケーションでは、LIKEなどを利用*することもあるかもしれませんが、それなりの規模になると、こういったテキストフィールドをLIKE検索するのは自殺行為になってきますし、あるとしても特殊なケースで、通常は別途全文検索用のサーバを構築して、そちらで検索を行うのが一般的かと思います。
そこで、WHERE句の対象にならない、つまりプライマリキーを利用してコンテンツを取得、あるいは更新するだけのテキストフィールドを、リスト2のように、
に分離するという手が使えます(図1)。
blogテーブル:
+----------------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+----------+------+-----+---------+-------+
| id | int(11) | | | 0 | |
| user_id | int(11) | YES | | NULL | |
| publication_datetime | datetime | YES | | NULL | |
+----------------------+----------+------+-----+---------+-------+
blog_textテーブル:
+----------------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+----------+------+-----+---------+-------+
| id | int(11) | | | 0 | |
| title | text | YES | | NULL | |
| content | text | YES | | NULL | |
+----------------------+----------+------+-----+---------+-------+
テキストデータに関しては、場合によってはデータベースである必要すらなく、単純なテキストファイルでもよいかもしれません。そして、
というようにアプリケーションを構築します。実際にはこの処理をデータアクセスレイヤーで吸収し、アプリケーションに掛かるコストを抑えるのがよいでしょう。
ブログやSNSのように、テキストフィールドが大半を占めるようなテーブルが存在する場合、このようなテキストデータの分離は、比較的低コストで、またアプリケーションの動作を特に制限することなくパフォーマンスを向上させることが可能です。
英単語のsaturationで、「飽和する」の意。IT業界では、マシンなどの性能を限界まで使い切ってしまうことを指すが、特に処理が追いつかないことで再送処理などを生み、処理を増やすという負の連鎖を指すことが多い。
データベースのテーブルからレコードを抽出するときに、条件を指定するためのSQL構文。
ワイルドカードを使ってテキストデータを検索するためのSQL演算子。
Copyright © ITmedia, Inc. All Rights Reserved.