большие базы данных

У меня есть онлайн-сервис (онлайн-тренажер словарного запаса). У каждого пользователя есть свой словарный запас.

Теперь я не уверен, как мне структурировать мою базу данных Mysql.

Насколько я знаю, у меня есть разные возможности:

  1. все в одной таблице (MyISAM): я храню весь словарь в одной большой таблице MyISAM и добавляю столбец «идентификатор пользователя», чтобы идентифицировать словарь каждого пользователя.

  2. у каждого пользователя есть своя таблица (MyISAM): каждый раз, когда создается пользователь, программа добавляет таблицу с именем вроде "vocabulary_{userid}", где {userid} должен связать таблицу с пользователем.

  3. все в одной таблице (InnoDB): как в первом пункте, но с InnoDB вместо MyISAM.

Проблема в том, что одна большая словарная таблица может содержать до 100 миллионов строк. С MyISAM проблема в том, что каждый запрос блокирует всю таблицу. Итак, я предполагаю, что если в сети много пользователей (и они отправляют много запросов), таблица может быть сильно заблокирована. А с InnoDB я просто не уверен, является ли это хорошим решением, поскольку у меня довольно много команд SELECT, UPDATE и INSERT.

Я надеюсь, что кто-нибудь может мне помочь. Заранее спасибо.


person atreju    schedule 28.12.2012    source источник
comment
Я не могу придумать худшего варианта, чем №2.   -  person JJJ    schedule 29.12.2012
comment
Я сомневаюсь, что реляционная база данных подходит для решения этой проблемы, хотя я не являюсь экспертом в этом вопросе.   -  person jpmc26    schedule 29.12.2012
comment
Я не могу придумать лучшего ответа, чем ответ Юханы.   -  person GolezTrol    schedule 29.12.2012
comment
@Juhana: Хорошо, я укушу! Как насчет отдельной базы данных для каждого пользователя!   -  person Gerrat    schedule 29.12.2012
comment
Спасибо большое за помощь. Я взял сейчас innoDB, и я надеюсь, что это сработает.   -  person atreju    schedule 30.12.2012


Ответы (3)


Почти всегда лучше использовать InnoDB. InnoDB может обрабатывать 100 миллионов строк, максимальный размер 64 ТБ.< /а>

Похоже, у вас не реляционный набор данных, а скорее хранилище ключей/значений. Возможно, лучше использовать Riak.

person Trent Earl    schedule 28.12.2012
comment
Соответствующие индексы являются обязательными при использовании таблицы реляционной базы данных. - person jpmc26; 29.12.2012

Это зависит

Если вы начнете иметь одну таблицу для каждого пользователя (также называемую сегментированием), у вас будут некоторые проблемы в начале.

если у вас нет необходимости в масштабе прямо сейчас. перейти на 1 таблицу с хорошими индексами. Я бы не использовал MyISAM, а InnoDB, иначе вы можете столкнуться с самой большой проблемой MyISAM (блокировки...)

person Gabriel Sosa    schedule 28.12.2012

Я думаю, что нормальный реляционный дизайн для этого будет использовать три таблицы:

  1. Пользователи — идентификатор пользователя и другие атрибуты: имя, адрес электронной почты и т. д.
  2. Лексика — наименее ясно из вопроса, но предположительно слова с такими атрибутами, как часть речи и, возможно, значение, возможно, включая идентификатор слова (поскольку некоторые варианты написания слов имеют несколько значений).
  3. User_Vocabulary — таблица с идентификатором пользователя, идентификатором Word и, возможно, такими атрибутами, как «дата изучения».

Если MyISAM блокирует таблицу во время выполнения запроса, вы не можете позволить себе использовать MyISAM, если вам нужны одновременные обновления таблицы User_Vocabulary. Итак, используйте InnoDB для всех таблиц.

person Jonathan Leffler    schedule 28.12.2012