Propel で bigint なカラムで order by すると遅い
なんでだろうと思って、生成された SQL をチェックしてみると、ORDER BY UPPER(xxx.ID) と UPPER() がつけられるために、インデックスが効かなくなっている模様。
それで、Propel にさかのぼってみると、どうやら bigint なカラムは Propel 的には string になり*1、さらに string なカラムは ORDER BY するときに UPPER() がつくということのようだ。
安易に bigint にしてたけど、実はそこまでの幅はいらないので、ひとまず int にして回避。
ググってみたら、同じ問題に当たってる人がいたのでメモ。
100% Hardcore X diary(2006-05-11)
"どうやらORDER BYを処理する際に、あらかじめ対象のカラムに関数が定義されている場合(例えばLOWER()とか、SUM() とか)はUPPER()はつけないようです。"
http://afromania.org/~k-ozaki/diary/20060511.html#p03
ということで、裏技的に回避できるみたい。
てか、いまさら気づいたけど「遅い」とかそういう問題じゃなくて、bigint なカラムでソートするとあさってな結果になるということか。深刻。