Open Source Web Development Tutorials - Dev Shed
MemCachedでMySQLの負荷を軽くする!
(2008/12/15公開)
MemCachedでMySQLの負荷を軽くしよう
コードベースの実行速度は確かにアプリケーションの全体的な拡張性を左右するが、最大のネックはたいていデータベースだ。最近のWeb開発環境ではたいてい、処理可能なページロード/秒は増えており、各ページは新しい情報を頻繁にリクエストしている。これらのページをレンダリングしているのは拡張しやすいWebサーバーであろう。MySQLなどのデータベースは非常に多くのクエリーを処理するよう設計されているとはいえ、遅かれ早かれこれらリクエストによるロードを処理しきれなくなるのだ。
酷使されるデータベース
Web上の各ページは、読み込まれた内容に関する幾十ものクエリーを出力することがある。すべてのページに、ユーザーの認証情報、セッション情報、システム通知、新しいメッセージ、最新ヘッドライン、構成情報、コンテンツエリアが読み込まれ、ユーザーが閲覧したり、ページ論理が働いたりしている。データがレンダリングプロセスに読まれるのと同時に、ほかのWebリクエストまたはバックグラウンド処理によって当該テーブルのデータが修正されるということが起こり得る。例えば、新しいヘッドラインを挿入したり、新しいコンテンツエリアを公開したり、ほかのユーザーのセッションを作成したりといった具合だ。こうした読み込みと書き込みが競合する状態がデータベースのネックとなることが多い。一般に、データベースの整合性を維持するため、書き込みが行われているデータは読み込めないよう保護する措置が講じられている。
典型的なMySQLの設定では、この問題が顕在化しやすい。MySQLテーブルのデフォルト形式では、いずれかの行が更新されている間、データベーステーブル全体にロックが掛かるからだ。このため、重要なテーブルへの書き込みを行うプロセスの実行中、雪だるま式に影響が及ぶことになる。例えば、ユーザーがログインしたりログアウトしたりするたびにセッションテーブルが更新される。すると、各ページロードは、セッションテーブルから読み込み、特定ユーザーの認証ステータスをクッキーに基づいて判断する。テーブルへの書き込みに起因するこうしたわずかな一時停止が積もり積もると、ある段階でいわば交通渋滞が発生し、サイト全体の速度が低下してしまうのだ。もとはと言えば、たった1つのデータベーステーブルへの書き込みだったのに。
読者のサイトで一時的な速度低下が見られる場合、MySQLコマンドラインを使ってトラブルシューティングを試みていただきたい。
mysql> show processlist;
|Id|User| Host | db |Command|Time|State | Info |
| 1|root|localhost|test| Query | 3 |Locked|select * from |
| 2|root|localhost|test| Query | 6 |Locked|insert into ON|
上記のとおり、ロックの掛かったテーブルのせいでクエリーの処理が滞っているなら、Stateフィールドにその旨、簡単な表示が出る。Timeフィールドにはクエリーが実行されてから経過した秒数が表示される。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








