теория

Куда база кладёт байты

Смотри, чтобы понять, почему запись подорожала, придётся на минуту заглянуть под капот — туда, куда разработчику обычно смотреть незачем. Обещаю: там на удивление красиво и логично.

У любого есть неизбежный компромисс: нельзя разом сделать мгновенными и запись, и чтение — приходится выбирать. Разные движки выбирают по-разному, и делятся они на два больших семейства.

Обновление на месте — . Данные лежат на диске страницами фиксированного размера, как карточки в картотеке. Чтобы сохранить строку, база находит нужную страницу и правит её прямо там. Но у этого есть цена: сперва изменение дописывается в — на случай, если свет погаснет посреди операции, — и только потом правится сама страница. А страницы разбросаны по диску, значит, запись бьёт по нему вразнобой. Зато точечное чтение «дай заказ №42» — молниеносное. Так устроен PostgreSQL, на котором живёт «Ярмарка».

Только дозапись — . Здесь идея другая: ничего не искать и не править на диске, а просто дописывать в конец. Свежие записи копятся в памяти в отсортированном виде — это . Накопилось достаточно — весь кусок разом, одним последовательным взмахом, ложится на диск неизменяемым файлом (). Файлы со временем плодятся, поэтому в фоне идёт : сливает их и выбрасывает перезаписанное и удалённое. Последовательная дозапись в конец — самое дешёвое, что умеет диск, поэтому LSM глотает запись жадно.

Запомни картинку: B-дерево правит на месте и любит чтение; LSM дописывает в конец и любит запись. «Быстрой» или «медленной» базы не бывает — бывает движок, попавший или не попавший в твою нагрузку. Осталось понять, в какую нагрузку не попала «Ярмарка».

← назад