単純なSQLのみで処理して速くするコツの話
単純なSQLのみ
合体すればするほど遅くなるのがSQL。
上級者ほど合体テクニックに溺れがちだと思う。
一度是非、単純なSQL縛りでプレイしてみてほしい。
※PHP+DBの場合で話します
1、単純SQL設計の考え方
照合処理はPHPでやる。
「ID:5の名前は?」なんてのはDBでやる必要はない。
それを書いたテキストファイルを用意して、それを読み込めばいい。
「ようこそdoudonnさん」という文字列を表示するのにJOINとか無駄の極み。
単発で使うことが多いユーザーデータなどは
情報をまとめたテキストファイルを作ると便利です。
それを読み込んで変数として使えば速いし負荷も無い。
当然、そんなテキストファイルはDBを利用して作成します。
ユーザーデータとなるテーブルの作成は必須。
更新の度に自動でファイルを作成する仕組みにする。
ブログの記事データなんかも同じことです。
テキストファイル化してPHPで処理することでSQLは単純になる。
2、セレクト処理を分ける
JOINするテーブルを個別にセレクトして値を取得する。
テーブルAで「id:5」の名前を取得して、テーブルBで所属部署を取得する。
求めるデータ量が少ない場合、わざわざJOINしてから取得する必要は無い。
そして、確実にインデックスを効かせられるので、こちらの方が速い場合がある。
クエリキャッシュ的にも有利になることが多いと思います。
個人的にはテーブルの管理も楽になってプログラミングもしやすいです。
あと、使い回せることが多い。
何でも1回で済まそうとする悪い癖は一度見直そう。
3、ファイル名に情報を含める
URLという情報の宝庫を利用する。
例えば、画像ファイルと記事IDを同じにすれば、
DBで画像URLを取得する必要は無くなります。
サイズやaltなんかも書けば完璧です。
URL=ファイル名はいくらでも情報を詰め込められる。
これを意識して設計すれば、DBへのアクセスはかなり減ります。
カテゴリ判定なんかもURLにカテゴリ名を入れれば必要ない。
URL設計が杜撰だとDB設計も大変です。
これはSQL単純化の基本。
4、機能を減らす
処理が複雑になる機能は廃止にしよう。
本当にそれは必要なのか?無くてもいいんじゃないか?
例えば、検索機能を無くせばSQLはスッキリします。
あと、こんな集計データもう要らんやろ!と捨てるのも良い。
馬鹿な話に思えると思いますが、これが一番大事なことです。
上司の思いつきで追加した機能が負荷になっていないだろうか?
機能はどんどん捨てていかないと苦しむ一方です。
「あったらいいな」を実相すると大変。
某ソシャゲもどうでもいいデータばかり集計していてエンジニア泣かせだった。
こんなのは絶対、「こんなデータも取得しようよ!」という他部署の提案が原因です。
当然、全体的に遅いもっさりしたゲームだった。
単純SQL化は無理なものは無理です。
捨てることを考えたい。
まとめ
DBを使うのは最後の策と考えたい。
基本的にはテキストファイルを読み込んで処理した方が速い。
1記事を表示するのに3つのテーブルから検索するのは無駄です。
ワードプレスはそんな無駄な処理をしているから遅い。
そうしてテキストファイル化にするためにDBを作ることは大事。
単純SQL化はDBを減らすという意味ではないです。
集計的な処理はJOINしても全然問題無い。
DBは便利ですが、甘えてはいけない。
PHP側のプログラミングを頑張ってDBは最小限に使っていこう。