勉強したことのメモ

webプログラマ見習いが勉強したことのメモ。

MySQLで速度改善

      2014/05/22

よく見るけど実際に対面してみて難しさが分かった。

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

  関連記事

msyql-image
MySQLのエラーメール送付

MySQLエラーを取得してエラーメール送付。 <? error_repor ...

msyql-image
mysqldumpが使えないレンタルサーバでMySQLのバックアップ

mysqldumpが使えないレンタルサーバで開発を行うことがあり、尚且つ他社に使 ...

msyql-image
MySQLでIPアドレスを数値として入れると変になる

MySQLでIPアドレスをINET_ATON関数を用いてINT型に変換し格納する ...

msyql-image
MySQLで経度緯度から半径○Kmのデータを抽出

経度と緯度をtext型として格納しているMySQLのテーブルがあり、指定した経度 ...

msyql-image
お名前.comの共用サーバー(SD)にphpmyadminを入れる

公式で書いてあるやつは3.4.2だけど、もうちょっと新しいバージョンを入れたかっ ...

msyql-image
MySQLで文字列の置換

MySQLで文字列の置換を行いたかった。以下に方法をメモ。   置換方 ...

msyql-image
文字コードのutf8_general_ciとutf8_unicode_ciの違い

MySQLで設定する時に使っているサーバーによってデフォルトの文字コードがutf ...

msyql-image
SSH接続でMySQLにデータをインポートする

phpMyAdminが入っていなかったり、SQLファイルが大きかったりという理由 ...

msyql-image
MySQLで同一サーバーの異なるDB内のテーブルをJOINする

同一のMySQLサーバーでdb1データベースのtable1テーブルと、db2デー ...

msyql-image
MySQLでユニークキーをはる

MySQLでseqとcodeみたいなものをあわせて ユニークキーをはりたかった。 ...