Как управлять миллионами пользователей?

17

Я собираюсь запустить что-то действительно большое. Мне нужно подготовить свой сервер и базу данных.

Я хотел бы сгруппировать каждый набор из 100 000 пользователей в отдельные пользовательские таблицы, но я не знаю, как связать одного пользователя, пытающегося войти в соответствующую пользовательскую таблицу.

Например, как я узнаю, что пользователь jay@mail.comсвязан с таблицей пользователей № 36?

Будет ли то же самое иметь 10 миллионов пользователей в одной таблице пользователей или 100 из 100 000 пользователей?

Как работает Facebook? Я не могу поверить, что у них была бы одна глобальная таблица пользователей с 950 миллионами записей.

JNK
источник
I can't believe they would have one global user table with 950 million entries.Я могу его не что большой. Я работал с большими таблицами. Это довольно часто. Другой вариант я хотел бы рассмотреть , если у вас есть много других данных является NoSQL базы данных.
НимЧимпски
5
Если вы планируете иметь большое количество пользователей и большое количество данных, вам необходимо нанять специалиста по базе данных для разработки этого. Я бы не стал смотреть на тех, кто не имеет опыта работы с базами данных не менее 10 лет и не менее 5 лет опыта разработки больших баз данных. Это сложный предмет, который требует обширных знаний.
HLGEM

Ответы:

30

Завтра у вас не будет миллиарда пользователей, и MySQL сможет обрабатывать несколько миллионов строк без проблем. У меня есть 5 миллионов пользователей в моей таблице пользователей, и, поверьте мне, даже на моем радаре не о чем беспокоиться.

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

Когда и когда вы когда-либо достигнете такого масштаба, у вас будет достаточно денег и ресурсов для решения этой проблемы.

Аарон Браун
источник
4
Be fast to launch and find the problems as they comeэта часть отличная. Это правда. Если мы обнаружим проблемы по мере их появления, серьезных проблем в будущем не будет. +1
ALH
16

Я не уверен, что внешние консультанты будут лучшей поддержкой для вашей компании, если вы собираетесь работать с действительно большими наборами данных, и вам нужно начинать с нуля. Пожалуйста, не поймите меня неправильно, но если кто-то испортит проект с таким количеством клиентов, это повлияет на вашу компанию.

Что касается 10М кортежей в одной таблице, если у вас хорошая индексация, все будет хорошо. Нам нужно хранить несколько 100M кортежей в одной таблице здесь (проданные товары), которая отлично работает на большом оракуле 11g

Вот сообщение от 2010 года с картой Facebook db design: дизайн базы данных Facebook

Вы можете прочитать документацию mysql о типах разделов, например: Документация MySQL: Partinioning

MySQL поддерживает эти типы:

ДИАПАЗОН разметки. Этот тип разделения назначает строки разделам на основе значений столбцов, попадающих в заданный диапазон. См. Раздел 18.2.1, «ДИАПАЗОН РАЗДЕЛЕНИЯ».

СПИСОК РАЗДЕЛЕНИЯ. Аналогично разделению по RANGE, за исключением того, что раздел выбирается на основе столбцов, соответствующих одному из набора дискретных значений. См. Раздел 18.2.2, «Разделение списка».

HASH- разделение. При таком типе разбиения раздел выбирается на основе значения, возвращаемого пользовательским выражением, которое оперирует значениями столбцов в строках, которые нужно вставить в таблицу. Функция может состоять из любого выражения, действительного в MySQL, которое выдает неотрицательное целочисленное значение. Расширение для этого типа, LINEAR HASH, также доступно. См. Раздел 18.2.3, «Разделение HASH».

КЛЮЧЕВОЕ РАЗДЕЛЕНИЕ. Этот тип разделения аналогичен разделению с помощью HASH, за исключением того, что предоставляется только один или несколько столбцов для оценки, а сервер MySQL предоставляет свою собственную функцию хеширования. Эти столбцы могут содержать значения, отличные от целочисленных, поскольку функция хеширования, предоставляемая MySQL, гарантирует целочисленный результат независимо от типа данных столбца. Расширение для этого типа, LINEAR KEY, также доступно. См. Раздел 18.2.4, «КЛЮЧЕВОЕ РАЗДЕЛЕНИЕ».

Гусь
источник
7

Прежде всего, не разделяйте пользователей на отдельные таблицы. Это сделает вещи сложными и бессмысленными. Базы данных, такие как MySQL и другие, могут без проблем работать с базами данных миллионов записей в одной и той же таблице (при правильной настройке ПЕРВИЧНЫХ КЛЮЧЕЙ). Используйте базу данных AUTO_INCREMENT AND PRIMARY поле уникального ключа для каждого пользователя (в основной пользовательской таблице), чтобы каждая запись была уникальной (UID). Затем в других таблицах вы ссылаетесь, используя этот уникальный идентификатор. Затем убедитесь, что в каждой таблице, в которой он установлен как PRIMARY KEY, это ускорит обработку информации на сервере базы данных. Из Drupal CMS вы можете узнать, как она хранит информацию о пользователях. Испытано более 10 лет миллионами пользователей и очень крупных компаний (используется крупными медийными компаниями, правительством, даже крупнейшими банками мира). На www.drupal. org, вы найдете более 1,6 миллиона страниц (узлов), хранящихся в одной таблице, и у него более миллиона уникальных посетителей в месяц, и веб-сайт работает без сбоев. Все о правильной оптимизации и настройке.

После 10 миллионов записей, если вы недовольны производительностью (после надлежащей оптимизации и изменений конфигурации базы данных), вы можете решить, действительно ли вы хотите разделить пользователей по разным таблицам. Таким образом, вы можете расширить функциональность, добавив новую таблицу с информацией о том, где хранятся записи пользователей: UID и table_name. Затем в любой другой таблице запрашивают эту информацию, эта таблица будет искать нужную таблицу. Но я действительно советую вам иметь одну большую таблицу для пользователей, если у вас нет более 10-100 миллионов записей. Но это не сильно улучшит производительность (базы данных предназначены для работы с огромными данными). Лучше держать информацию простой. Обычно компании просто выбирают другой сервер базы данных (главный и подчиненный), а затем другой работает вместе с функцией балансировки нагрузки. Если у вас будет 10 миллионов пользователей, вы могли бы заплатить за другой сервер БД, верно?

См. Пример userсхемы таблицы в файле user.install .

kenorb
источник
3

Как показывают другие ответы, разбивать пользователей на несколько таблиц не очень хорошая идея. Большинство баз данных, имеющих индексы по идентификатору пользователя, могут обрабатывать миллионы строк. Однако задержка на запрос может увеличиваться в зависимости от общего числа записей в индексе. Пока набор данных небольшой, вы можете управлять одной таблицей в обычных базах данных.

Я постараюсь добавить другую идею и для вашего дальнейшего рассмотрения, если вы выйдете далеко за миллион записей или около того. При таком большом количестве клиентов вы не хотите простоев и т. Д. Итак, есть множество баз данных nosql, на которые вы, возможно, захотите посмотреть. Они будут выполнять проверку для вас, а не вы сами управляете защитой из приложения. Они также обеспечат избыточность данных и, следовательно, увеличат время безотказной работы. Facebook и все активно используют memcache и т. Д. Для своего кеша. Но я не уверен, что они используют для своего постоянного магазина.

Важно отметить, что вы не можете выполнять объединения и т. Д. С базами данных nosql. Итак, спланируйте свой вариант использования и решите. Если вам необходимы объединения и многозадачные транзакции, тогда базы данных nosql не для вас.

Сунил
источник
-3

почему бы не разделить на основе алфавитного диапазона? Если у вас будут миллионы пользователей, создайте отдельную таблицу для каждой буквы или для пары букв (таблица «a» для пользователей с именем пользователя, начинающимся с «a»). Сначала это будет очень сложно, но, поскольку вы ожидаете большую базу данных и хотите иметь возможность различать, какую таблицу следует использовать для конкретного пользователя - я предполагаю, что алфавитный порядок является очевидным и самым простым выбором.

mnmnc
источник
9
Это супер плохая идея. Например, вашему программному обеспечению придется автоматически переносить строки, если пользователи меняют фамилию .... если вы не перестанете заботиться о согласованности. Эта стратегия предлагает эти виды непредвиденных обстоятельств.
randomx