statistics が長い

研究に LuceneMySQL をつかっているんだが1リクエストの処理に長いときで1分以上かかっていたので、ちょっとボトルネックを調べたら、原因は下のような SQL だった。

SELECT * FROM foo WHERE field_a IN (...) AND field_b IN (...) 

それぞれの IN 区には 200から300個くらいの値がほうりこまれるんだけど、INDEX はきちんと

CREATE INDEX i ON foo(field_a, field_b);

みたいな感じで作っているから大丈夫だと思っていた。が、SHOW PROCESSLIST を実行してみると Statistics(オプティマイザのための統計情報収集中) に数十秒かかっているでやんの。なんだこれ。
しかも、possible keys*1 は1つしかないくせに USE INDEX (i) つけようが FORCE INDEX (i) つけようが、IGNORE INDEX (PRIMARY) つけようが結果は同じ。ぬぅ。まあ、場合によっては index scan より full table scan の方が速いから分からないではないのだが、クエリの最適化に数十秒も掛けてどうするよ。
とりえあえず、オプティマイザの実行を禁止できればいいような気がするが、そんな方法はないっぽいので、下のようにサブクエリにして対処。

SELECT * FROM (SELECT * FROM foo WHERE field_a IN (...)) AS a WHERE field_b IN (...)

*1:検索に使用できるインデックス