【ソリューション事業部 井上】
ここへきて山本さんのまさかの旅ブログ。
レゴの完成はまだ先延ばしなのでしょうか?
それとも放置状態なのか、気になるところです。
ちなみに、
–1.遅い(かもしれない)
SELECT * FROM Address WHERE prefecture IN (‘鳥取’, ‘徳島’, ‘東京’, ‘大阪’);
ですが、鳥取県さんからクレームがこないかドキドキしますね。
しかし今見返してみても山本さんのSQLのチューニング記事は参考になりますね。
業務でもここを見ながら山本先生に指摘うけないよう注意しなければ(・_・;)
さて直近のお仕事で、社内のローカルのみで利用しているシステムですが、
ウェブサイトの表示速度改善に対しての取り組みを行いましたので、
その中でも特に効果のあった施策をご紹介したいと思います。
□実施内容
1)従来cgi版のPHPから、fastcgi・opcache導入
モジュール版に移行するにはユーザ権限等の問題でハードルが若干高い為、
fastcgiへの移行を実施しました。
こちら一般的にPHPのCGI版は遅いと言われていますが、
インパクトとしてはopcacheの機能が有効になった事での速度改善が大きかったと感じます。
従来ではapc、現在はopcacheが主な選択のようですが、継続したプロセスを必要とする為に
CGI版ではphp.iniでenableとなっていても、キャッシュヒットしない仕様の様です。
最近のフレームワークは大規模な物が多く、当社で使用しているzendframeworkも
大規模な部類に入るようですのでopcacheの導入効果は大いに発揮できているように感じます。
2)pgsql confファイル設定
基本的な設定は実施済みだったので、
さほど効果は見込めないかなと思いこんでいましたが、
社内で別で用意しているステージング環境と比較しながら検証をしていくと
本番環境の方がDBのレスポンスが総合的に遅い結果でした。
差分を比較しながら検証を進め、
default_statistics_targetの値をデフォルト値(100)に戻す事で速度が改善されました。
※アナライズ実施も必要です。
マニュアルによると、
「サイズを大きくするほどプランナの解析する情報がきめ細かくなる。」
とある為、プランナの誤った解析を避ける目的で数値を上げていましたが、
きめ細かくなる=検索速度が遅くなる という事のようです。
正確さとスピードはやはりトレードオフの関係にあるようです。
何事も適正値が一番 という事と理解しました。
大規模DBとなった際には改めてお世話になろうかと思います。
3)クエリ改善
有る程度施策は実施済みでしたので、改めてボトルネック箇所の調査から。
しかし現状の要件を満たしたままでの速度改善は難しい印象で、
アプリ側での対応は結果見送る事に。
今回のクエリレベルでの対応は頻繁に使われるorderbyとwhereを確認し、複合インデックスを設定しました。
なんと意外にもこれが大きく速度改善して、sqlのレスポンスが1/3に。
多用は危険ですが、多く利用される検索で0.9秒のsqlのレスポンスが
0.3秒になったのはとんだボーナスでした。
4)html遅延ロード
リスト画面等でhtmlの表示ボリュームが非常に多い画面があったのですが、
ユーザ的にはブラウザアイコンのローディングが完了するまで待たされている感を感じるものです。
最近の技術を駆使すればajaxでread more的な処理を実装する流れがトレンドかもしれませんが、
複雑な構成にすることでメンテナンス性を落とす施策へは、まだ踏み切れませんでした。
そこで今回はhtmlの遅延ロードを採用しました。
対応は、
初回表示領域の部分のみdisplay:block;とし、
それ以外は、display:none;とする。
そしてロード後(onready)、1ms後に表示処理を実行 です。
//遅延ロード
setTimeout(function(){
$(‘.inview’).show();
},1);
表示したいデータ量と希望する表示速度の要件が相反している中では、
(SEOを気にしなくていい条件下限定ですが)これは最終手段かもしれません。
最初はバカみたいな案だなーと自分でも思いながらコーディングしていたのですが、
たった3行の実装の割には、体感できる効果は大きかったと思います。
(速度は何もかわっていません。。あくまで体感です。)
以上、長々と書いてきましたが
数ある施策のうち、以外にも効果のあった施策のご紹介でした。
最後にうちの明音ちゃんです。
寝返りとずりばいをマスターしたようで、やんちゃに成長しています。
しかしおしゃぶりに頼りっぱなしの日々です。
早く暖かくなって奥さんの地元鳥取県に連れていってあげたいと思う
今日この頃です。