Я собираюсь запустить что-то действительно большое. Мне нужно подготовить свой сервер и базу данных.
Я хотел бы сгруппировать каждый набор из 100 000 пользователей в отдельные пользовательские таблицы, но я не знаю, как связать одного пользователя, пытающегося войти в соответствующую пользовательскую таблицу.
Например, как я узнаю, что пользователь jay@mail.com
связан с таблицей пользователей № 36?
Будет ли то же самое иметь 10 миллионов пользователей в одной таблице пользователей или 100 из 100 000 пользователей?
Как работает Facebook? Я не могу поверить, что у них была бы одна глобальная таблица пользователей с 950 миллионами записей.
I can't believe they would have one global user table with 950 million entries.
Я могу его не что большой. Я работал с большими таблицами. Это довольно часто. Другой вариант я хотел бы рассмотреть , если у вас есть много других данных является NoSQL базы данных.Ответы:
Завтра у вас не будет миллиарда пользователей, и MySQL сможет обрабатывать несколько миллионов строк без проблем. У меня есть 5 миллионов пользователей в моей таблице пользователей, и, поверьте мне, даже на моем радаре не о чем беспокоиться.
Не беспокойтесь о шардинге, пока вам не понадобится это сделать. Вы пытаетесь преждевременно оптимизировать проблему, которая может существовать, а может и не существовать, и в процессе вы серьезно ограничите скорость, с которой вы можете вводить новшества. Быстро запускайте и находите проблемы по мере их появления. Вы не можете заранее предсказать, какими будут ваши проблемы масштабирования.
Когда и когда вы когда-либо достигнете такого масштаба, у вас будет достаточно денег и ресурсов для решения этой проблемы.
источник
Be fast to launch and find the problems as they come
эта часть отличная. Это правда. Если мы обнаружим проблемы по мере их появления, серьезных проблем в будущем не будет. +1Я не уверен, что внешние консультанты будут лучшей поддержкой для вашей компании, если вы собираетесь работать с действительно большими наборами данных, и вам нужно начинать с нуля. Пожалуйста, не поймите меня неправильно, но если кто-то испортит проект с таким количеством клиентов, это повлияет на вашу компанию.
Что касается 10М кортежей в одной таблице, если у вас хорошая индексация, все будет хорошо. Нам нужно хранить несколько 100M кортежей в одной таблице здесь (проданные товары), которая отлично работает на большом оракуле 11g
Вот сообщение от 2010 года с картой Facebook db design: дизайн базы данных Facebook
Вы можете прочитать документацию mysql о типах разделов, например: Документация MySQL: Partinioning
MySQL поддерживает эти типы:
источник
Прежде всего, не разделяйте пользователей на отдельные таблицы. Это сделает вещи сложными и бессмысленными. Базы данных, такие как 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 .источник
Как показывают другие ответы, разбивать пользователей на несколько таблиц не очень хорошая идея. Большинство баз данных, имеющих индексы по идентификатору пользователя, могут обрабатывать миллионы строк. Однако задержка на запрос может увеличиваться в зависимости от общего числа записей в индексе. Пока набор данных небольшой, вы можете управлять одной таблицей в обычных базах данных.
Я постараюсь добавить другую идею и для вашего дальнейшего рассмотрения, если вы выйдете далеко за миллион записей или около того. При таком большом количестве клиентов вы не хотите простоев и т. Д. Итак, есть множество баз данных nosql, на которые вы, возможно, захотите посмотреть. Они будут выполнять проверку для вас, а не вы сами управляете защитой из приложения. Они также обеспечат избыточность данных и, следовательно, увеличат время безотказной работы. Facebook и все активно используют memcache и т. Д. Для своего кеша. Но я не уверен, что они используют для своего постоянного магазина.
Важно отметить, что вы не можете выполнять объединения и т. Д. С базами данных nosql. Итак, спланируйте свой вариант использования и решите. Если вам необходимы объединения и многозадачные транзакции, тогда базы данных nosql не для вас.
источник
почему бы не разделить на основе алфавитного диапазона? Если у вас будут миллионы пользователей, создайте отдельную таблицу для каждой буквы или для пары букв (таблица «a» для пользователей с именем пользователя, начинающимся с «a»). Сначала это будет очень сложно, но, поскольку вы ожидаете большую базу данных и хотите иметь возможность различать, какую таблицу следует использовать для конкретного пользователя - я предполагаю, что алфавитный порядок является очевидным и самым простым выбором.
источник