Как обрабатывать внешний ключ при разбиении - PullRequest
2 голосов
/ 08 октября 2009

Я работаю над управлением автопарком. У меня большое количество записей в таблице местоположений со следующими столбцами

  1. дата
  2. время
  3. номер транспортного средства
  4. длинный
  5. широта
  6. Скорость
  7. ИД пользователя (который является внешним ключом ...)

Здесь в этой таблице будет выполняться операция записи каждые 3 секунды. Следовательно, в нем будут миллионы записей. Таким образом, чтобы получить более быстрые данные, я планирую раздел. Теперь мой вопрос: -

  1. Как обращаться с внешним ключом? Я слышал, что раздел не поддерживает внешний ключ
  2. Какой столбец следует использовать для раздела.
  3. необходимо ли иметь уникальный ключ в качестве столбца раздела.

Будет триллионов записей

@ rc -Спасибо ... что за производительность ... видите, я вставляю данные каждые 3 секунды, так что мне нужно запускать процедуру проверки каждый раз, когда я вставляю данные ... так что насчет производительности ??

2> Я хотел бы перейти к колонке разделов как транспортное средство № ..... есть ли альтернативный способ ...

1 Ответ

9 голосов
/ 08 октября 2009

Чтение: Ограничения разбиения MySQL

1.) FK не поддерживаются в многораздельных таблицах.

  • Один из вариантов - создать хранимую процедуру, которая вставляет / обновляет запись, и проверять внутри процедуры, что переданный идентификатор пользователя присутствует в вашей таблице пользователей перед выполнением вставки. Вы должны настроить разрешения для таблицы так, чтобы только SP разрешалось обновлять и вставлять, чтобы позволить приложениям и / или пользователям выполнять задний ход проверки. Вам также нужно будет принять меры предосторожности при удалении пользователей из таблицы пользователей.

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

3.) Для получения дополнительной информации см. Ссылку выше.

Редактировать в зависимости от вопроса пользователя:

Вставка записи каждые 3 секунды не слишком высокая пропускная способность. Убедитесь, что у вас есть первичный ключ в таблице пользователей, чтобы проверка внутри процедуры выполнялась эффективно. (Это верно даже в том случае, если поддерживаются FK). DB будет выполнять эту проверку для вас за кулисами, если у вас есть поддержка FK, так что в этом смысле это не вредит вам. Если проверка оказывается узким местом, вы можете почувствовать необходимость отбросить ее и, возможно, сообщить ошибочные идентификаторы пользователей как ночной пакетный процесс, но если ваша таблица пользователей относительно мала и правильно проиндексирована, я не вижу, что это выпуск.

Другим вариантом будет ручное разбиение (то есть разбиение) на многораздельные или однораздельные таблицы. Разумеется, с однораздельными таблицами вы можете использовать собственные внешние ключи. Например, вы бы разбили свою таблицу транспортных средств на несколько таблиц, например: (при условии, что вы хотите использовать номер транспортного средства в качестве «ключа»)

VehiclesNosLessThan1000

VehiclesNosLessThan2000

VehiclesNosLessThan ...

VehiclesNosLessThanMAX

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

Обратите внимание, что одним из преимуществ этого является то, что в настоящее время MyISAM блокирует всю секционированную таблицу во время обновлений, а не только тот раздел, который она обновляет. Разделение таблицы таким образом устраняет эту конкуренцию, поскольку сами таблицы являются «разделами».

Исходя из имеющихся у меня ограниченных данных о том, что вы делаете, я, вероятно, написал бы 2 хранимые процедуры, 1 для выбора данных и 1 для обновления / вставки данных, и чтобы ваше приложение использовало их для любого доступа. Затем я попытался бы сначала выполнить обычное разбиение с помощью хеша на vehicleNo, в то же время применяя ключ user_id в процедуре. Если это становится проблемой, вы можете легко перейти к разделению данных между несколькими таблицами, не изменяя приложение, поскольку вся логика получения и обновления данных содержится в SP.

...