勉強したことのメモ

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

  関連記事

msyql-image
MySQLでデータがあれば更新、無ければ挿入

DBにデータがあれば更新、無ければ挿入(新規作成)を 行いたい際に使えるものがあ ...

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

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

msyql-image
MySQLで加算しつつNULL値は0にする

いくつかのコードに対して投票を行い、 その合計値をスコアとして出したい。 ただ、 ...

msyql-image
MySQLでパターンマッチの逆

LIKE検索の逆ってなったのでメモ。 NOT LIKE '%あああ%' が正解み ...

msyql-image
MySQLが起動も再起動もできない

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

msyql-image
コマンドでMySQLに郵便番号データを入れる

練習としてコマンドから郵便番号データを入れた際のメモ。 --------- 1: ...

msyql-image
MySQLで複数のテーブルを異なるデータベースと異なるカラムでJOIN

ちょっとややこしいんだけど、以下のような条件で3つのテーブルを結合したかった。 ...

msyql-image
エックスサーバーでMySQLのサイズに注意

エックスサーバーで自動更新のログをMySQLに保存するようなシステムを動かしてい ...

msyql-image
MySQLでREGEXPについて

SQL文にREGEXPというのを見てこれ何? となったのでメモ。 ■参考サイト ...

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

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