Наше веб-приложение с 100 000 одновременно работающих пользователей имеет сценарий использования, при котором мы автоматически сохраняем активность пользователя каждые 5 секунд.Рассмотрим таблицу, подобную этой:
create table essays
(
id uuid not null constraint essays_pkey primary key,
userId text not null,
essayparts jsonb default '{ }' :: jsonb,
create_date timestamp with time zone default now() not null,
modify_date timestamp with time zone default now() not null
);
create index essays_create_idx on essays ("create_date");
create index essays_modify_idx on essays ("modify_date");
Это хорошо работает для нас, поскольку все материалы, связанные с эссе пользователя, такие как заголовок, краткий подпись.запросчик, тело полного эссе и т. д. хранятся в столбце essayparts
в формате JSON.Для автоматического сохранения эссе мы не вставляем новые строки все время.Мы обновляем каждый идентификатор (каждое эссе) со всеми его компонентами.
Таким образом, в каждом эссе есть множество обновлений, так как это трудоемкая и продуманная работа.Учитывая автоматическое сохранение каждые 5 секунд, если бы пользователь должен был писать полчаса, мы бы обновили его эссе около 360 раз.
Это было бы хорошо с функциональностью «HOT» (только кучи) в PostgreSQL.Мы используем v10, поэтому мы в порядке.Однако проблема в том, что мы также обновляем столбец modify_date
каждый раз, когда эссе сохраняется, и у него тоже есть индекс.Это означает, что по принципу HOT это не приносит пользы от обновления HOT, и происходит большая фрагментация.
Я предполагаю, что в мире Интернета или мобильных устройств это не является необычной моделью.Многие сервисы, похоже, автоматически сохраняют контент.Они только вставляют?Если это так, если пользователь выходит из системы и возвращается, как они показывают записи, глядя на max(modify_date)
?Или есть какой-то другой механизм для использования обновлений HOT при одновременном обновлении индексированного столбца в таблице?
Спасибо за любые указатели, спасибо!