その後
読み出し一貫性の問題を無視できるとしよう。
この場合、もはやSQL一発にこだわらなくていいので、こんな方法で上のSQLを合計30秒ぐらいでこなしてしまった。
以下result。
create table inhist_count as select userid, count(something) as inc from inhist group by userid create table outhist_count as select userid, count(something) as outc from outhist group by userid create index hoge on inhist_count(userid) create index fuga on outhist_count(userid) create table result as select userid, inc, outc from hoge, inhist_count, outhist_count where hoge.userid=inhist_count.userid and 結合いろいろ
だめ。最後が劇重。さよなら。
create table inout_count as select userid, inc, outc from inhist, outhist from inhist.userid=outhist.userid create index hoge on inout_count(userid)
これでどうなの。
create table result as select userid, inc, outc from hoge, inout_count where hoge.userid=inout_count.userid
ハアハア。終わり。
うーん、それにしても悩まされる。Oracleのオプティマイザもバカなときがあるが、これほどではない。ひょっとしたら処理能力の差? MyISAM形式ってスター結合に向いてない、とかいろいろあるかな? 悩ましい。
explainしていくとインデックス使ってなかったりはわかるんだけど。
そのかわり? informixのtemporary tableみたいなのがMySQLにもある。オンメモリなテーブルでセッションの間だけ有効なやつとか。今回は件数が多いのもあって使わなかったけど、「いろいろできる」感はあるんだよねえ。
ビットマップ索引もそのうちサポートされないだろうか。>MySQL