MySQLで速度改善
よく見るけど実際に対面してみて難しさが分かった。
150万件ほどのデータがあって、1年分のデータを抽出する
というページなんだけど、今まで通りに何も考えずに作ると
表示に15秒前後かかった。
下記に速度改善で行ったことをメモ。
-------------
1:インデックスを張る
結果的に5~7秒ほどの改善になった。
データが多いほど効果が出ると実感。
尚、注意点として、
・クエリ内容によってはインデックスが使われない場合がある
⇒インデックスの張り方が悪かったり、ワイルドカード使ってたりするとアウト。
ちゃんと使われているか確認すること(※1)。
・マルチカラムインデックスを使う場合は順番に気をつける
⇒WHEREの順番にインデックスを張るらしい。
・インデックスを張るとINSERT時に遅くなる
があった。
※1はphpMyAdminのExplainを使用した。
■参考サイト
http://www.triton.biz/sb1/?p=684
http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
-------------
2:SQL分の細かい部分を調整
それぞれにテーブル名を割り振ると少しはやくなった。
■例
SELECT a.seq, a.code
FROM table_a a
WHERE ~~~
期間指定はBETWEENより比較演算子の方が早かった。
これについてはケースバイケースな気がする。
が、今回のケースでは1つのSQL分で0.2秒の短縮になった。
WHEREで絞り込んでいく条件を細かく変えてみるのも有効。
WHERE A B C とあり、
A ⇒ 大きく絞り込める
B ⇒ 半分ぐらい絞り込める
C ⇒ あまり絞り込めない
の場合、ABCの順番で絞込みを行うのが基本みたい。
また、ここはインデックスの順番もあわせること。
-------------
3:並列処理を行う
アクセス数の多いページだと危険だけど、並列処理を
行うことで時短になった。
■参考サイト
http://qiita.com/Hiraku/items/1c67b51040246efb4254
イメージ的に並列で必要なPHPファイルにアクセスして、
アクセス先のファイルでMySQLに接続、抽出後
結果を元ファイルに戻すみたいな感じ。
5つのファイルがあって1つ辺り1秒かかる処理の場合、
直列だと5秒かかるけど並列だと1秒で済むみたい。
-------------
4:クエリキャッシュを使う
SET GLOBAL query_cache_size = 1000000;
で使える。キャッシュされている情報を呼び出すときは
即返ってくる。
初めてクエリキャッシュ使ったけどこれが一番熱かった。
-------------
上記を用いて、キャッシュがある場合は即時反映、
無い場合でも5秒ほどで表示されるようになった。
関連記事
-
-
mysqlで正規化できない時はシリアライズ使う
アンケートか何かに機能追加している際、配列を カンマ区切りで結合して文字列でDB ...
-
-
MySQLiで直近に挿入したオートインクリメントの値と次回挿入する値を取得する方法
phpとmysqliを使っている中で次回挿入するオートインクリメントの値と、前回 ...
-
-
WordPressサイトのロードアベレージが高い
あるWordPressサイトのロードアベレージが先月ぐらいまでは通常0.5前後で ...
-
-
MySQLでdatetime型データの〇日後を取得する方法(DATEDIFF)
MySQLでdatetime型データがあり、何日経過しているかを取得し、〇日経過 ...
-
-
MySQLの値について
既存プログラムの解析をしてて知ったこと。 MySQLの構造で「int(11)」と ...
-
-
MySQLで大文字小文字
半角英数字のみのフォームで入力した値を検索した際、 データに差異が発生。 [Aa ...
-
-
MySQLでテーブルとデータの複製(コピー)
MySQLでテーブルとデータを複製したかった。ダンプとかではなく、簡単なSQL文 ...
-
-
市区町村のMySQL用データが欲しい
都道府県と市区町村が連携したセレクトメニューを作成したかった。具体的には大阪府を ...
-
-
InnoDBのオートインクリメント
MySQLのInnoDBでIDというカラムにオートインクリメント設定していたが、 ...
-
-
phpMyAdminより高速で軽量なAdminerが凄い
MySQLをGUIで管理できるphpMyAdmin。特に不満はないんだけど、もっ ...
- PREV
- PHPで指定月の月末日を取得
- NEXT
- MySQLで使用するインデックスを指定する