page_adsence

2011年3月11日金曜日

MySQLの高速化を図った時のログ

今取り組んでいる仕事で、集計データを格納しているテーブルが30個近くあり、それを一つのViewにまとめてしまおうと思ったのですが、調べてみていろいろとわかったのでメモ。

集約するような場合にビューを使用すると致命的に遅くなってしまう。
なぜかというと、結局ビューも実体をもたないただのクエリだから。
そんなビューに対して集約するようなクエリを投げると以下のような流れで集約の作業が行われる。

元テーブルでそれぞれ集約→その結果を結合してさらに集約

ということで、ビューで集約はできない。
じゃあどうするか。

次に思い浮かんだのは全テーブルを1つのテーブルにしてしまうこと。
しかしそれでは素材数によっては1日でかなりの量のレコードが追加されていくことになる。
MyISAMの場合、1テーブルの最大サイズは4GBまでになっており、
何年も集約結果が蓄積されていくことを考えると実現することは難しい。

となるとどういった方法がいいのか…。
結局各テーブルからデータを取得する際にインデックスを適切に貼り、
ひとつひとつのクエリの実行速度を上げていくしかないと思う。
ひとつひとつのクエリの実行速度が上がれば、ビューを作成してもかかる時間は短縮されるはず。