
$natural order в MongoDb и TokuMX.
Есть такое понятие относительно любых хранилищ данных как натуральный порядок (natural order). Это порядок, в котором данные физически располагаются на диске. В MongoDb когда мы делаем пустой find-запрос либо явно указываем сортировку sort({$natural: 1}), то получаем ответ в natural order. Причем он не обязательно совпадает с порядком вставки документов. Он может меняться если документ в процессе апдейта растет и релоцируется на диске.
Когда натуральный порядок совпадает с порядком вставки,это можно эффективно использовать. Например в задачах, где хочется понимать очередность добавления данных в базу: message passing, логирование, временные ряды. Тут надо сделать ремарку, что мы имеем дело с eventual-consistency базами и строгих гарантий очередности вставки у нас нет. В MongoDb в случае append-only сценария порядок вставки идентичен natural order. Монга в этом похожа на MyISAM-движок MySQL — сырые данные хранятся отдельно, а все ключи в том числе первичный указывают на расположение данных в хранилище. Вот отсюда и получаем тот самый натуральный порядок, в котором хранятся сырые данные.
А теперь взглянем на TokuMX. В отличии от монги TokuMX использует кластерный первичный ключ как, например, в InnoDB движке того же мускуля (http://www.tokutek.com/2013/07/comparing-mongodb-mysql-and-tokumx-data-layout/). Сырые данные располагаются на диске в порядке, определяемым первичным ключем _id. Чем же он нам не подходит, ведь он специально спроектирован так, чтобы более поздние данные имели большее значение ObjectId (http://docs.mongodb.org/manual/reference/glossary/#term-objectid)? А проблема в том, что ObjectId генерируется на клиентской стороне. Если есть разбежки по времени на тех машинах, с которых поступают данные в базу, то и порядок вставки по ключу _id получится не соответствующим натуральному.
Будьте внимательны, на эту неочевидную на первый взгляд граблю легко наступить. В TokuMX лучше с небольшим бубном сделать честный инкрементальный ключ (http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/#auto-increment-counters-collection).