Как наилучшим образом объединить данные из хранилищ значений и ключей - PullRequest
0 голосов
/ 26 марта 2012

Предположим, у нас есть таблица списка друзей для социальной сети.

В большинстве случаев требуется, чтобы таблица списка друзей была присоединена к другой таблице, где хранятся ваши личные данные, такие как: имя, возраст, город, URL-адрес профиля, время последнего входа в систему и т. Д. *

Как только таблица списка друзей окажется в диапазоне 100M строк. Подобные запросы на JOIN могут занять несколько секунд. Если вы введете несколько других условий WHERE, это может быть даже медленнее.

Системы хранения ключей-значений могут очень быстро внести список друзей.

Давайте предположим, что мы хотели бы показать 10 последних зарегистрированных друзей пользователя. Каков наилучший способ рассчитать этот результат? Несколько методов, о которых я думал, приведены ниже. Есть ли в них смысл?

  • Должны ли мы хранить все данные в среде хранилища значений ключей? Обновите хранилище ключей с каждым новым логином?
  • Или мы сначала потянем идентификатор списка друзей. Затем используйте команду базы данных, например «IN ()», и запросите базу данных?
  • Объединить данные на уровне клиента? Решение JavaScript?

1 Ответ

0 голосов
/ 26 марта 2012

В вашей таблице Users у вас есть поле для сохранения отметки времени для последнего входа в систему.В вашей таблице, где хранятся дружеские отношения, у вас есть 1 строка на каждое отношение, и это делает таблицу очень длинной.

То есть объединение этих таблиц кажется плохим, и мы должны как-то оптимизировать этот процесс?Ответ: нет, не обязательно.Люди, которые создают СУБД, имеют те же проблемы, что и вы, и они реализуют инструменты для их решения.Каждая СУБД имеет своего рода оптимизацию запросов, которая умнее вас и меня.

Так что стыдно объединять длинные таблицы.Если вы хотите попробовать оптимизировать, вы можете:

  • Получить идентификаторы друзей пользователя.
  • Получите необходимую информацию о первых 10 друзьях, отсортированных по last_login desc, где подходит идентификатор (и другие, где условия).

Вам не нужно вступать в таблицы,но вы будете использовать два запроса, так что, возможно, если ваша СУБД умна, соединение будет быстрее (возможно, запустите тест).

Если вы хотите, вы можете использовать ajax для загрузки этих данных после загрузки страницы,это улучшит взаимодействие с пользователем, но трафик на БД будет таким же.

Надеюсь, это помогло.

Редактировать: О да, если вы уже знали идентификаторы друзей (выони нужны для других вещей) тебе даже не понадобится соединение.Вы можете передать идентификаторы в javascript, который загружает последний список входа позже через AJAX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...