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 なカラムでソートするとあさってな結果になるということか。深刻。

*1:MySQL 的には bigint