勉強したことのメモ

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

MySQLでJOINの高速化

      2018/04/24

JOINで無茶苦茶悩んだのでメモ。やりたかった事は、MySQLで

  • テーブルAには必要最低限のログが格納
  • テーブルBにはカテゴライズ情報が格納
  • AとBを組み合わせてカテゴリー毎に集計したい

というもの。

あと難点として、テーブルAは200万件ほどデータが入っていて、尚且つサーバースペックが5年以上前のものらしくあまりよくないらしい。

で、最初に考えた案としては普通にJOINして、結果をWHEREで絞って集計。

みたいな感じ。結合のキーは文字列。

1日毎の集計だと問題ないけど月間、年間で集計したら
トラフィックがえげつないことになった。

かといってPHPで処理したらメモリ不足でタイムアウトが発生した。

上司に相談したところ、DBの構成を考え直した方が良いとの回答。

どうしようもないなら下記みたいにしてみたら、とのこと。

 

結合する際は、各々の件数を減らした上で結合するといいらしい。試してみると確かに高速化になった。

ただ、これでもトラフィックがあれだったのでDBの構成を考え直すことに。

1番はAテーブルにカテゴライズ情報を一緒に格納することだけど、色々事情があってそれはしたくなかった。

妥協案としてJOIN用のテーブルを作って解決できそう。要点はプライマリのカラムを結合させる。

idとかseqとかautoincrementに設定するようなものを結合キーにすると速度が出た。

今後も同じことがあると思うので覚えておく。

 - MySQL

  関連記事

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

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

お名前SDサーバにMySQLデータのインポート

お名前.comのレンタルサーバにそこそこ大きいサイズのMySQLデータを移行した ...

MySQLが起動も再起動もできない

サイトで障害が発生した。FTPやSSH接続は出来るけどサイト自体は表示されない。 ...

MySQLで速度改善

よく見るけど実際に対面してみて難しさが分かった。 150万件ほどのデータがあって ...

MySQLのクエリキャッシュ設定

以前クエリキャッシュを設定していたけど、 これだとmysqlを再起動した時に再度 ...

MySQLでテーブルの詳細情報を取得

MySQLでテーブルの詳細情報を取得 desc テーブル名; ■サンプル mys ...

MySQLで文字列の置換

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

MySQLでIPを整数値としてカラムに格納する

MySQLでIPを整数値としてカラムに格納しているケースがあった。今までIPが必 ...

MySQLでホスト指定しても正常に接続できない場合

MySQL自体は動いており、ユーザーも登録されているのに、ホスト名を指定しても正 ...

PHPからMySQLにシリアライズしたデータを格納

アンケートフォームみたいなのがあって、 今後も定期開催し、尚且つ質問内容は増減す ...