7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

こんにちは!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での一括取得は「ユーザー名がたくさん必要なランキング」などで本当に効果がありました。

小さな工夫を積み重ねていくと、
「遅くてイライラする」→「サクサク動く!」に変えられるので、
これからも色々試していきたいです。

終わりに

「この記事が少しでも役に立った!」と思ったら、いいね、コメントであなたの工夫もぜひ教えてください!

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?