データベース
PHPとMySQLで速度改善
ぽんて
更新日:2021/08/12
PHPの関数で速度改善
関数を使い分けることで高速化を考えてみました。
しかし、それほど影響力は大きくないのでそこまで気にする必要はないはないかも。
10万回くらい繰り返すLoop系処理の中であれば気にしても良いかも程度です。
型変換(約2.1倍)
intval(‘1’); → (int)’1’;
文字列の置換(約2.1倍)
preg_replace(‘/Taro/’, ‘Ponte’, “YamadaTaro”) →
str_replace(‘Taro’, ‘Ponte’, “YamadaTaro”);
文字列の数字判定(約3.7倍)
preg_match( ‘/^[0-9]+$/’ , ”77”) → ctype_digit(”77”)
PHPのロジックで速度改善
PHPに限ったことではないが、以下のようなN+1問題は極力避けるべきです。
1 2 3 4 |
$users = User::all(); foreach($users as $user) { \DB::table('comment')->where($user->user_id); } |
どうしても使わざる得ないときは、loop内の処理で取得するデータ量を減らすことを意識するだけでもかなり変わると思います。
SQLで速度改善
クエリの書き方を工夫しよう!
アスタリスクは使わない
アスタリスクは使わず必要最小限のデータだけ取得するように気をつけましょう。
例:select * from user; → select user_id,user_name from user;
型にあった呼び出しをする
下記はDBテーブルのIDをint型で設定している場合の例です。intに関わらず、文字列で指定すると内部でint型に変換される処理が増えるため遅くなります。
初めから設定されている型を指定するようにしましょう。
例:select * from user where id= ’1’ ; → select * from user where id= 1;
他、MySQL機能
パーティション
MySQLにはパーティションという機能があります。
この機能を使うと以下の図のように一つのテーブルを複数のテーブルとして扱い、検索や更新の速度向上を見込めます。
使い方等はこのサイトがわかりやすいです。
https://qiita.com/taroshin/items/608076c9f8e09497c4b1
slowクエリ
これは実行速度の遅いクエリを捕捉したいときに有効です。
例えば、2秒以上かかっているクエリが実行されたとき、そのクエリだけを捕捉しログに追加するといった使い方ができます。
ただ、実行するたびにSlowログを見つける、ログに吐き出すといった通常では不要な処理がたされるため、常時SlowログをONにすることはおすすめしません。
リリースから○日間など、期間限定での実施が良いと思います。
設定方法などは以下サイトが参考になります
https://weblabo.oscasierra.net/mysql-slow-query-log-1/
最後に
色々書きましたが最低限頭に入れておくべきは
必要最低限のデータだけを、
必要最低限の回数で、
適切なクエリにより取得する!
をDBデータを取得するときに意識するだけで良いと思います。
今まで意識していなかったのであれば、これでかなり速度は上がるはずです。