勉強したことのメモ

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の値について

既存プログラムの解析をしてて知ったこと。 MySQLの構造で「int(11)」と ...

msyql-image
MySQLでREGEXPについて

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

msyql-image
phpMyAdminでのエクスポート/インポート

DBのバックアップを取る際にエクスポート/インポートを行うが、 データ件数が多い ...

msyql-image
ランダム表示のページング

MySQLからデータを持ってくる際に、 ランダムな表示を行ってほしいと言われた。 ...

msyql-image
MySQLで月別に集計を行う。あと日付時刻関数。

現在進行形でやっているデータ集計系だけど 新たな発見があったのでメモ。 ■日付時 ...

images
エラー管理まとめ

■エラーログをとる。 error_reporting(E_ALL ^ E_NOT ...

msyql-image
phpmyadminからプロセスの停止

重たいSQL文を叩いた際、どうにも処理できず メモリ使用率が100%から下がらな ...

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

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

msyql-image
MySQLでスレッドの実行状況を表示

データベースサーバが重たく、原因を調査する機会があった。サーバ自体のメモリやCP ...

msyql-image
mysqlでrootのパスワードが分からない場合

pleskで管理しているサーバがあり、mysqlのrootのパスワードが分からな ...