スタッフブログ STAFF BLOG
webの辰人 | 2019.06.10
WordPressなどで遅くなってきたなと感じたら
MySQL
WordPressなどでも使われているSQL。
データ件数が増えていくと、結構遅くなったりしますね。
より処理性能のよいサーバーに乗り換えるなど対策はいろいろありますが、
まずサーバを増強やチューニングする前に、
PHP処理やクエリなどを見直すと速度改善が可能かもしれません。
ちょっと専門的な話になりますが、
チューニング以外で軽く思いつくものを書いてみたいと思います。
・INDEXを貼るカラムは適切かどうか
そもそもの問題になってきますが、
検索に頻繁に利用するカラムについてはインデックスを適切に張る必要があります。
間違ってもすべてのカラムに張るなんてことはやめておきましょう、激重になります。
・SQL検索条件にインデックスを使用しているか
検索条件にインデックスを利用せずTABLE全件検索を行っていませんか。
速度改善のために適切なインデックスを張ったカラムを利用しましょう。
・無駄なカラムの読み込みを行っていないか
SELECT * として、カラムの内容を全て読み込んでいないか。
SELECT `XX1`,`XX2`,`XX3`と、指定してあげた方がもちろん速いです。
不必要なカラムは余計な処理を招くだけですので、必要なものだけ呼んできましょう。
・SQL文にクォートをつけ忘れていないか
クォートをつけずとも利用は可能ですが、しっかりつけましょう。
面倒だとは思いますが、パフォーマンスに多大な影響を与えます。
SQL文のフィールド名、検索語など解釈に時間がかかるため、
クォートにより判定のスピードをあげましょう。
数十万件のデータ読み出しで5000倍ほどの開きも出てきます。
・必要な行数のみフェッチしているか
HTML上で利用するデータのリストなどはLIMITをかけて件数制限をしましょう。
LIMITをかけずに数十万件のデータを読み込むのは非常に効率が悪いです。
使うものだけ呼んでくるのがスマートです。
・DBアクセス回数を最小にしているか
何度も、何度も同じテーブルにアクセスして違うデータを取ってくるのは非効率的です。
1回で複数の値を取る方法がある場合はそちらを選択しましょう。
・WHERE句 条件判定を極力少なくしているか
設計の問題もありますが、同じ条件で分岐する場合は複数書く必要もありません、
必要なものだけ書き、判定を極力少なくしましょう。
・WHERE句 で指定するカラムは行数が少ない方から指定しているか
WHERE句 判定の順にも気をつけましょう、先判定で行数が少ない方を優先で書きましょう。
・できる限りSQL側で処理を行っているか
PHP側のロジックでSQLができることをでカバーすると、ほぼ遅くなります。
設計にもよりますが、どちらに処理をさせるかは見極めをしっかりしましょう。
DBサーバの処理を肩代わりできるのは、四則演算と最後のソートだけだそうです。
WordPressなどでも使われているSQL。
データ件数が増えていくと、結構遅くなったりしますね。
より処理性能のよいサーバーに乗り換えるなど対策はいろいろありますが、
まずサーバを増強やチューニングする前に、
PHP処理やクエリなどを見直すと速度改善が可能かもしれません。
ちょっと専門的な話になりますが、
チューニング以外で軽く思いつくものを書いてみたいと思います。
・INDEXを貼るカラムは適切かどうか
そもそもの問題になってきますが、
検索に頻繁に利用するカラムについてはインデックスを適切に張る必要があります。
間違ってもすべてのカラムに張るなんてことはやめておきましょう、激重になります。
・SQL検索条件にインデックスを使用しているか
検索条件にインデックスを利用せずTABLE全件検索を行っていませんか。
速度改善のために適切なインデックスを張ったカラムを利用しましょう。
・無駄なカラムの読み込みを行っていないか
SELECT * として、カラムの内容を全て読み込んでいないか。
SELECT `XX1`,`XX2`,`XX3`と、指定してあげた方がもちろん速いです。
不必要なカラムは余計な処理を招くだけですので、必要なものだけ呼んできましょう。
・SQL文にクォートをつけ忘れていないか
クォートをつけずとも利用は可能ですが、しっかりつけましょう。
面倒だとは思いますが、パフォーマンスに多大な影響を与えます。
SQL文のフィールド名、検索語など解釈に時間がかかるため、
クォートにより判定のスピードをあげましょう。
数十万件のデータ読み出しで5000倍ほどの開きも出てきます。
・必要な行数のみフェッチしているか
HTML上で利用するデータのリストなどはLIMITをかけて件数制限をしましょう。
LIMITをかけずに数十万件のデータを読み込むのは非常に効率が悪いです。
使うものだけ呼んでくるのがスマートです。
・DBアクセス回数を最小にしているか
何度も、何度も同じテーブルにアクセスして違うデータを取ってくるのは非効率的です。
1回で複数の値を取る方法がある場合はそちらを選択しましょう。
・WHERE句 条件判定を極力少なくしているか
設計の問題もありますが、同じ条件で分岐する場合は複数書く必要もありません、
必要なものだけ書き、判定を極力少なくしましょう。
・WHERE句 で指定するカラムは行数が少ない方から指定しているか
WHERE句 判定の順にも気をつけましょう、先判定で行数が少ない方を優先で書きましょう。
・できる限りSQL側で処理を行っているか
PHP側のロジックでSQLができることをでカバーすると、ほぼ遅くなります。
設計にもよりますが、どちらに処理をさせるかは見極めをしっかりしましょう。
DBサーバの処理を肩代わりできるのは、四則演算と最後のソートだけだそうです。
このブログについて
「プログラマー辰人が、日々感じた事をおくるインターネット初心者向けのコラム」 ・・・かもしれない
webの辰人
itou.tatsuhiko