<< Prev Page Next Page >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


MySQL謎の挙動!ORDER BY DESC + LIMIT = 狂

先日、MySQL5.0でどうしても納得のいかない不具合に悩まされたのだけど、ネットで探しても同じことに悩んでる人がいなかったのでここに。

不具合の概要

特定の条件を満たしたテーブルで、WHEREとORDER BY DESCとLIMITを併用したとき、ORDER BYが狂う。

まあ何言ってるかわからんと思うのでサンプルソースを。

不具合が起こるテーブル

CREATE TABLE IF NOT EXISTS `test` (
 `test_id` int(10) unsigned NOT NULL auto_increment,
 `name` varchar(40) NOT NULL,
 `delete_flg` int(10) unsigned NOT NULL,
 PRIMARY KEY  (`test_id`),
 KEY `delete_flg` (`delete_flg`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;

INSERT INTO `test` (`test_id`, `name`, `delete_flg`) VALUES
(1, 'tanaka', 0),
(2, 'kimura', 0),
(3, 'suzuki', 0),
(4, 'yamamoto', 0),
(5, 'alice', 0),
(6, 'bob', 0),
(7, 'cathy', 0);

なんの変哲もない感じ。ちょっと変わってるのはdelete_flgがBOOLでなくてUNSIGNED INTになってる。これについてはこちらの記事で書いた。

不具合が起こるSELECT

SELECT * FROM `test`
WHERE delete_flg = 0
ORDER BY test_id desc
LIMIT 0, 5

別に大したことないでしょ。しかし、これを実行したとたん恐ろしいことが起こるのです!

起こる現象

期待するのは test_id が 7, 6, 5, 4, 3 と並んだ一覧なのに、どういうわけか、1, 2, 3, 4, 5がとれてくる。

こうすると起こらなくなる

  • ORDER BY から desc外す
  • LIMIT 7以上にする
  • OFFSET 1以上にする
  • WHERE 節を除く
  • ORDER BY 他のカラムにするとDESCでもちゃんと動く

なにがトリガーなのかわからん

自分が触れるいろんな環境で上記を試してみたところ、MySQLのバージョンによって?起こったり起こらなかったりするみたいな気がする。

  • 5.1.41 起こらない
  • 5.0.77 起こらない
  • 5.0.67(windows) 起こる
  • 5.0.58 起こる
  • 5.0.51 起こる
  • 5.0.37 起こらない!

もしくは他の要因がなにかあるのか?

とりあえず回避

なんだかよくわからないが、delete_flgのインデックスを削除すると現象は起こらなくなった。うーん。


この記事に対するコメント

この記事に対するコメントの投稿



管理者にだけ表示を許可する

この記事に対するトラックバック

トラックバックURL
http://tockri.blog78.fc2.com/tb.php/228-d1133f22
この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。