前置き
運営しているサービスがかなりレガシーなので、負の遺産が多いです。
入社した頃からサイトの速度が遅いなと感じていながら、日々の業務を追われているうちに後回しになっていました。
それから半年たったある日、SEOに注力する方針となり上司からサービスのサイトの表示速度が遅いので、本日中に何とかしてほしいとのことでようやく時間を割いて対応することになりました。
環境
- PHP 5.2
- Breeze framework
- MariaDB 5.5.62
速度改善で要因特定にやったこと
- Chromeのデバックツールで表示速度を確認
- バックエンドかフロントエンドか要因を切り分け
- バックエンドに時間がかかっていることが判明
- PHPのソースコード内に速度を図るコードを埋め込み
- DBの処理に時間がかかっていることが判明
速度改善にやったことまとめ
- (効果:◎)DB:EXPLAINで実行計画を行い、INDEXを設定
- (効果:△)PHP:ロジックを修正(不要な処理を削除)
- (効果:◎)DB:EXPLAINで実行計画を行い、INDEXを設定
- (効果:△)PHP:ロジックを修正(取得系の処理改善)
- (効果:◎)DB:クエリキャッシュを有効にする
DBの速度改善が効果絶大だったので、対応したことを後記していきます。
DB:EXPLAINで実行計画を行い、INDEXを設定
-- インデックス削除
ALTER TABLE example_table_1 DROP INDEX user_id(user_id);
-- インデックス追加
ALTER TABLE example_table_2 ADD INDEX index_user_id(user_id);
DB:クエリキャッシュを有効にする
DBを再起動せずに反映する方法
SET GLOBAL query_cache_size=64*1024*1024;
SET GLOBAL query_cache_limit=8*1024*1024;
SET GLOBAL query_cache_type=1;
FLUSH QUERY CACHE;
実施結果
サイトの表示速度がなんと「5800ms」から「350ms」になりました。
およそ16倍の速度改善をすることが出来ました。
……クエリキャッシュの威力半端ない!!
最後に
ちょっとした設定一つでこんなにもサイトの表示速度が変わるのは感動しました。
むしろ今まで放置だったのも良くないですが…(苦笑)
いま、動いているリソースで改善できることはまだまだありますね!
とはいえ、ミドルウェアのバージョンがそもそも古かったり、フレームワークが古かったり、サーバーのスペックが適切でなかったり……
根本的な要因もあるので、引き続き地道に改善していきつつ思い切った決断をする必要もありそうですね。