その後

 読み出し一貫性の問題を無視できるとしよう。
 この場合、もはや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