こんにちは!CureSabaです。
高校生ですが、趣味でPHPのWebアプリを触っています。今回は「キャッシュ」と「DBアクセスの最適化」にテーマを絞って、自分の経験を元に具体例を紹介します。
1. キャッシュを使って「毎回同じ処理」を減らそう
最初に作った掲示板アプリは、アクセスが増えるとどんどん遅くなりました。
調べてみたら「同じデータを何度もDBから取ってる」「ランキング集計を毎回やってる」みたいなムダが多かったです。
実際にやったこと
-
PHPのOPcacheを有効化
サーバーのphp.ini
でopcache.enable=1
を入れるだけで、PHPのコード読み込みが速くなりました。
-
Redisでランキングをキャッシュ
人気投稿のランキングを毎回計算するのをやめて、5分に1回だけ計算→Redisに保存するようにしました。$redis = new Redis(); $redis->connect('localhost', 6379); $ranking = $redis->get('ranking'); if (!$ranking) { $ranking = getRankingFromDB(); // ←DBから重い集計 $redis->setex('ranking', 300, json_encode($ranking)); // 5分キャッシュ } else { $ranking = json_decode($ranking, true); }
これで「急に重くなる」ことがほぼ無くなりました。
2. データベースアクセスを減らす・まとめる
掲示板で「投稿一覧」を表示する時、投稿ごとに「ユーザー名」を取るために毎回SQLを叩いていました。これが超ムダで、ページ表示が遅くなる原因でした。
実際にやったこと
-
JOINで一気に情報を取る
// 悪い例:ループで毎回ユーザー取得 foreach ($posts as $post) { $user = getUserById($post['user_id']); // ←毎回SQL } // 良い例:JOINでまとめて取得 $stmt = $pdo->query("SELECT posts.*, users.username FROM posts JOIN users ON posts.user_id = users.id"); $posts = $stmt->fetchAll();
これだけで「ページ表示が一瞬で終わる」ようになりました。
-
インデックスをつける
WHEREやORDER BYでよく使うカラム(例:user_id、created_atなど)にインデックスを貼ると、検索が速くなりました。
使用例まとめ
例えば「投稿が多い掲示板」でも、
- 投稿一覧はJOINで一括取得
- ランキングはRedisでキャッシュ
- OPcacheも有効化
この3つをやっただけで「アクセス増えても落ちにくい」アプリになりました。
まとめ
今回紹介したのは「キャッシュの活用」と「DBアクセスの最適化」だけですが、
どちらも実際に自分でPHPアプリを作ってみて「体感で速くなった!」と感じた方法です。
特に、Redisによるキャッシュは「同じ集計を何度もしない」だけでサーバーの軽さも全然違いましたし、
JOINでの一括取得は「ユーザー名がたくさん必要なランキング」などで本当に効果がありました。
小さな工夫を積み重ねていくと、
「遅くてイライラする」→「サクサク動く!」に変えられるので、
これからも色々試していきたいです。
終わりに
「この記事が少しでも役に立った!」と思ったら、いいね、コメントであなたの工夫もぜひ教えてください!