2009年7月3日金曜日

Webアプリの最適化(SymfonyとDoctrineとSQLite)

お客さんから「自社のWebアプリで不具合が発生するので調査してほしい」という仕事を受けた。具体的には、1000件を超えるレコードを一括更新するとWebアプリが応答しなくなる、ということ。データベースのアップデートに時間がかかってタイムアウトが発生していると推察し、早速調査を開始した。

このアプリ、PHPフレームワークSymfonyを使っていたが、実務では初めてだった。しかし、URLからアクションクラスを呼び出す、という仕組みは今まで使っていたZendFrameworkと同じなので、現象の発生個所を特定するのには時間がかからなかった。

問題はここから。SymfonyではORマッパーにPropelを使うものだと思って、それらしいファイルを探してみたが見つからない。いろいろ調べているうちにDoctrineなんてクラスが呼ばれていることを発見。これがPropelに代わるORマッパーということに気付かなかった。

Doctrineのマニュアルを紐解き、やっとのことでデータベース設定内容を確認できたので、登録処理のロジックから無駄と思われる個所を取り除いたところ、パフォーマンスは1.5倍に上がった。

さらに、バックエンドとして使っているSQLiteでは大量のレコードを更新するときにはトランザクションを使うとパフォーマンスがあがる、ということなんで試してみたら処理速度は約2倍。

最終的に変更前から比べて3倍の処理速度向上となったので、お客さんも喜んでくれたと思う。こういう最適化って、やりだすと病みつきになっちゃうんだよな~。

0 件のコメント:

コメントを投稿