Yaroslav Schekin
Понимаете... если "подтасовать колоду" (т.е., например, сравнивать ACID b-tree и non-ACID LSM; или сравнивать single-threaded LSM
игрушку с полноценным многопользовательским b-tree; или в benchmarks использовать исключительно "случайные" данные; или сравнивать "базовую" реализацию b-tree с сильно оптимизированным LSM и т.д. и т.п.), то "победить"
очень легко.
И я почитал thread, да (и там люди тоже почему-то сомневаются, что эти результаты показывают / доказывают "победу").
Так что если Вам интересно — посмотрите
http://www.lmdb.tech/bench/inmem/ ;)
Я не подтосовывал колоду. Я сравнивал Постгрес с RocksDB где LSM вполне себе ACID-ая. И с своим собственным расширением lsm3, которое на самом деле не фига не LSM, а "вариация на тему", сделанная на базе 3ёх обчных постгресовый btree, со всеми сопутствующими ACIDными гарантиями.
Вот приведённая ссылка на in-memory беннчмарк, как раз на мой взгляд совершенно не уместна, потому как преимущество LSM как раз обеспечивается в том случае, когда индекс не влезает в память.
Я не утверждал, что LSM всегда и на любой нагрузке лучше,чем B-Tree. Как раз наоборот. Но есть use case, на котором оно однозначно и убедительно выигрывает: вставки случайных ключей в большую тблицу с запасом не влезающую в память. Насколько это "синтетический"use case? Я не знаю. Но у нас в ПгПро было множество заказчиков, у которых профиль нагрузки был именно такой.
Почему в данном случае классическое Б-Дерево тормозит?Потому чтобы сделать поиск или вставку случайного ключа нужно прочитать несколько (зависит от глубины дерева) страниц с диска. Обычно это 1-2 страницы, верхушка дерева всё таки влезает в кэш. Среднее время чтения с жёсткого диска 10msec. Т.е. 100 таких операций в секунду. Соотвественно даже если нам надо читать всего одну листьевую страничку у нас TPS-ы получаются ограниченными этой 100-ей. В NVM скорость случайных чтений на порядок быстрее. Но всё ещё на порядки уступает скорости доступа к памяти.
LSM-у же не надо ничего читать с диска, чтобы сделать вставку. Он просто вставляет в ключ в верхушку пирамиды, которая расположена в памяти, а потом в бэкграунде оно сливается с нижними уровнями. Сливание - это последовательное чтение и запись, что диски умеют делать достаточно хорошо. Отсюда и получается разница в скорости в разы. Начиная с какого-то момента скорость вставки в B-Tree начинает резко падать пока не упирается в скорость случайного чтения. А скорость LSM-а остаётся более менее постоянной.
Кто не верит - может сам взять тест и проверить. Или написать свой. Требуется только соблюдение трёх условий:
- преобладание вставок, причём без проверок уникальности
- случайное распределение ключей
- индекс не влезает в память
Как видно - это достаточно ограниченный сценарий. Поэтому речь не коим образом не идёт о замене B-Treа на LSM.
Но понимать когда LSM может обеспечит существенный выигрыш в скорости - весьма ИМХО полезно