勉強したことのメモ

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内のテーブルをJOINする

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

images
WordPressで「データベース接続確立のエラー」

WordPressで設定ファイル(wp-config.php)は触っていないのに ...

msyql-image
MySQLで速度改善

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

msyql-image
phpMyAdminでテーブルの操作

table_aと同じ構造のtable_bを作りたい時、 手動で作成するか、tab ...

msyql-image
直近のクエリで発行されたAUTO_INCREMENTの値を取得する

やりたかったことは、 新規登録(INSERT)なら、登録時のAUTO_INCRE ...

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

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

msyql-image
権限が無い場合のエラー

SQLでINSERTする際、見たことに無いエラーに遭遇した。 INSERT co ...

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

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

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

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

msyql-image
MySQLでWhere句を使ってカラム指定でデータコピー

MySQLで大量のデータを保存しているテーブルがあり、そのデータを絞った上で尚且 ...