という話

技術ブログにしたい

MariaDBで値が同じレコードをorder byしてlimitを指定するとlimit値によって取得出来るデータが変わる

MariaDBのバージョン
mysql Ver 15.1 Distrib 10.0.10-MariaDB, for Linux (x86_64) using readline 5.1

MariaDB [test]> desc test_table;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| test_id    | int(11)  | YES  |     | NULL    |                |
| created_at | datetime | YES  |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

こんなテーブルがあって

MariaDB [test]> select * from test_table;
+----+---------+---------------------+
| id | test_id | created_at          |
+----+---------+---------------------+
|  2 |     555 | 2014-05-02 12:34:56 |
|  4 |     333 | 2014-05-02 12:34:56 |
|  6 |     111 | 2014-05-02 12:34:56 |
|  8 |     444 | 2014-05-02 12:34:56 |
| 10 |     222 | 2014-05-02 12:34:56 |
+----+---------+---------------------+
5 rows in set (0.00 sec)

バッチ処理とかで入れたら大体こんな感じにcreated_atが一緒なレコードが登録されます
で、created_atをorder byして、limitを1から順に増やしてみます

MariaDB [test]> select * from test_table order by created_at limit 1;
+----+---------+---------------------+
| id | test_id | created_at          |
+----+---------+---------------------+
| 10 |     222 | 2014-05-02 12:34:56 |
+----+---------+---------------------+
1 row in set (0.00 sec)

!?

MariaDB [test]> select * from test_table order by created_at limit 2;
+----+---------+---------------------+
| id | test_id | created_at          |
+----+---------+---------------------+
| 10 |     222 | 2014-05-02 12:34:56 |
|  4 |     333 | 2014-05-02 12:34:56 |
+----+---------+---------------------+
2 rows in set (0.01 sec)

ワッザ!?


MariaDB [test]> select * from test_table order by created_at limit 3;
+----+---------+---------------------+
| id | test_id | created_at          |
+----+---------+---------------------+
| 10 |     222 | 2014-05-02 12:34:56 |
|  4 |     333 | 2014-05-02 12:34:56 |
|  6 |     111 | 2014-05-02 12:34:56 |
+----+---------+---------------------+
3 rows in set (0.01 sec)

これはなにでソートされた順なんでしょう・・・?

MariaDB [test]> select * from test_table order by created_at limit 4;
+----+---------+---------------------+
| id | test_id | created_at          |
+----+---------+---------------------+
|  2 |     555 | 2014-05-02 12:34:56 |
|  4 |     333 | 2014-05-02 12:34:56 |
|  6 |     111 | 2014-05-02 12:34:56 |
|  8 |     444 | 2014-05-02 12:34:56 |
+----+---------+---------------------+
4 rows in set (0.00 sec)

指定してない時と同じになった

MariaDB [test]> select * from test_table order by created_at limit 5;
+----+---------+---------------------+
| id | test_id | created_at          |
+----+---------+---------------------+
|  2 |     555 | 2014-05-02 12:34:56 |
|  4 |     333 | 2014-05-02 12:34:56 |
|  6 |     111 | 2014-05-02 12:34:56 |
|  8 |     444 | 2014-05-02 12:34:56 |
| 10 |     222 | 2014-05-02 12:34:56 |
+----+---------+---------------------+
5 rows in set (0.00 sec)

これもlimit 4の時と変わらず。


ちなみにMysqlだとこの現象は起きませんでした。
MariaDBで同じテーブルを違うlimitで取得するときは注意ですね。



既知のバグかもしれないですがMariaDBのバグ管理ページは当然全部英語なので分からないという・・・。
プログラマに英語必須ですね。。。