Mysql: несколько таблиц или одна большая таблица?

Этот вопрос уже задавался, но я не нашел "1 голосовой ответ".

Это лучше сделать:

  • 1 большой стол с:

user_id | attribute_1 | attribute_2 | attribute_3 | attribute_4

  • или 4 маленьких таблицы с: user_id | attribute_1

user_id | attribute_2

user_id | attribute_3

user_id | attribute_4

1 большой стол или много маленьких столов? Каждый пользователь может иметь только 1 значение для attribute_X. У нас много данных для сохранения (100 миллионов пользователей). Мы используем innoDB. Производительность действительно важна для нас (10 000 запросов / с).

Спасибо!

Франсуа

2 ответа

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

Например, возможная схема:

CREATE TABLE user_attributes (
  id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  user_id INT NOT NULL,
  attribute_name VARCHAR(255) NOT NULL,
  attribute_value VARCHAR(255),
  UNIQUE INDEX index_user_attributes_name(user_id, attribute_name)
);

Это базовый шаблон хранилища значений ключей, в котором вы можете иметь много атрибутов на пользователя.

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

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

Я предположил бы, что это будет на стадии ~10-50 миллионов строк, но может быть выше, если количество операций вставки в этой таблице относительно низкое.

Не забывайте, что лучший способ оптимизировать активность чтения - это использовать кеш: самый быстрый запрос к базе данных - это тот, который вы не делаете. Для такого рода вещей вы обычно используете что-то вроде http://memcached.org/ для хранения результатов предыдущих выборок, и вы бы аннулировали это при записи.

Как всегда, сравните любую предложенную схему в масштабе производства.

1 большая таблица с: user_id | attribute_1 | attribute_2 | attribute_3 | attribute_4

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

Другие вопросы по тегам