Упорядоченный список онлайн-пользователей с разбивкой по страницам в postgresql, решение?C#

Место общения программистов C#
Ответить
Anonymous
 Упорядоченный список онлайн-пользователей с разбивкой по страницам в postgresql, решение?

Сообщение Anonymous »

Я пишу приложение, и во время стресс-тестирования мне интересно посмотреть, как оно масштабируется. Алгоритм поиска других пользователей довольно сложен и включает в себя несколько индексов, объединений и т. д. в postgresql (совпадения зависят от множества факторов, а не только от простых полей профиля). Postgresql, как и любая реляционная база данных, очень хорошо оптимизирован для возврата всех идентификаторов пользователей для такого запроса.
Проблема в том, что мне нужно постраничное решение, упорядоченное по последнему онлайн-статусу пользователя (большинство недавние пользователи DateTime отображаются первыми). Таким образом, если во время запроса я хочу позвонить на «страницу 5» последних онлайн-пользователей, я могу просто указать размер страницы OFFSET * и LIMIT и получить предсказуемые результаты.
Теперь из-за требований сортировки для последнего шага требуется дорогостоящая операция ORDER BY. Я предполагаю, что эта операция равна n log n или около того, но несмотря на это, другие части алгоритма поиска можно свести к ~ log n, поэтому ORDER BY определенно является узким местом.
Во время При стресс-тестировании на 1 миллионе пользователей производительность запросов из-за ORDER BY резко падает, как и ожидалось.
Решения, которые я пробовал, включают использование контейнера, отсортированного в памяти. профили пользователей и вместо этого выполнять запросы к ним (при необходимости синхронизировать их с базой данных). Проблема тогда, хотя теперь я могу использовать упорядоченный контейнер пользователей вместо отношения (чего, насколько мне известно, реляционная база данных не предлагает, если бы это было так, проблема решена), другие части запроса были очень быстрыми. в postgresql теперь, как и ожидалось, стал чрезвычайно медленным (у нас больше нет всех преимуществ, которые предлагает база данных для больших объемов данных, таких как индексы, оптимизатор запросов и т. д.).
Последнее решение, о котором думали : Создайте представление/таблицу моментального снимка с ORDER BY, который не обновляется. Поскольку теперь это упорядочено и никогда не меняет состояние, его можно запросить. Поддерживайте устаревшее состояние в течение x секунд (скажем, 30) и используйте это. Удалите и заново создайте его каждые 30 секунд или около того (с помощью запроса ORDER BY).
Есть ли здесь какое-то очевидное решение, которое я пропустил, что мы можем иметь отсортированное отношение пользователей что мы можем запрашивать в журнале n раз, то есть: нам не нужно выполнять дорогостоящую операцию ORDER BY для каждого вызова? Я понимаю, что мы не можем сделать это в postgresql, но как насчет любого другого технического решения, позволяющего обойти эту проблему?
Мне любопытно, как крупные веб-сайты должны справляться с этим, учитывая фундаментальные ограничения баз данных, которые они используют. не разрешать сортировку отношений и требования к постраничным результатам.
Что не будет работать:
  • Запрашиваем все совпадающие идентификаторы пользователей из базы данных, затем передаем эти идентификаторы пользователей в отсортированный в памяти контейнер с идентификаторами пользователей для сравнения и каким-то образом сортируем их таким образом. Не будет работать, поскольку пользователи могут искать всех пользователей, если захотят. Это позволило бы получить 1 миллион пользователей по поисковому запросу только для одного пользователя, чтобы просто получить небольшую страницу пользователей. Не очень хорошее решение.
  • Я не думаю, что материализованное представление — это то, что мне нужно. Хотя у меня нет большого опыта работы с ними, согласно документации, ОБНОВЛЕНИЕ в материализованном представлении может привести к потере порядка, поэтому это неприемлемо.

    < li>Распределенные решения, такие как Redis, имеют монолитную архитектуру по выбору (если только Redis не может предложить те же преимущества, что и postgresql, такие как индексы, оптимизатор запросов и т. д., но опять же, почему бы просто не использовать C# непосредственно в памяти, если я' Я не использую распределенное решение? Неужели у C# нет эквивалента?).
Если нет очевидного решения, я ' Мне не хватает, будут ли какие-либо серьезные недостатки простого использования моей идеи создания представления или таблицы моментального снимка с ORDER BY, к которому пользователи могут запрашивать (может быть более 1 тыс. запросов в секунду) и воссоздавать его каждые 30 секунд или около того? Если это плохая идея, есть ли альтернативные предложения?
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/791 ... l-solution
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»