MySQL таблица разделена - PullRequest
       1

MySQL таблица разделена

0 голосов
/ 23 февраля 2012

У меня есть таблица с около 20 столбцами.10 из них, как правило, имеют 1 из 15 или около того возможных значений (разные для каждого столбца).Кроме того, один столбец имеет длинную строку.Таблица в настоящее время имеет более 3 миллионов строк и продолжает расти.Он имеет размер около 1 ГБ (только данные)

  1. Я бы хотел отделить большой текстовый столбец, поскольку он используется не часто и, вероятно, значительно уменьшит размер таблицы, что приведет к повышению производительности.
  2. Я бы хотел "нормализовать" все эти повторяющиеся столбцы в отдельной таблице (каждой), чтобы я мог получить список текущих значений без выполнения 10 distinct запросов в 3M строках.Это займет много времени.

# 2 будет отношения один ко многим.# 1 может быть 1-к-1 или 1-ко-многим.Мне все равно.

Вопрос: можно ли это сделать с помощью операторов чистого SQL?Как?Или мне нужно написать программу, чтобы поместить данные в новую таблицу, получить PK и вставить его в правый столбец, по одной строке за раз?

Редактировать
Вот пример того, что я пытаюсь сделать:

ID  Field1  Lookup  Text
10  val1    look1   some very long text
11  val2    look2   more very long text
12  val2    look1   NULL
13  val4    look1   some very long text
.
.
.

На это:

ID  Field1  Lookup  Text
10  val1    1       1
11  val2    2       2
12  val2    1       0
13  val4    1       4 (1?)
.
.
.

1 Ответ

1 голос
/ 23 февраля 2012

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

  1. Создайте свою таблицу mytable_text с PK того же типа (конечно, не с автоматическим приращением), вашим столбцом TEXT и, если вы используете InnoDB (что рекомендуется в этом случае), внешним ключом для вашего первого (главный) стол.Вы можете добавить ON DELETE CASCADE к внешнему ключу, чтобы упростить обслуживание.
  2. INSERT INTO mytable_text (id, large_text_column) (SELECT id, large_text_column FROM mytable)
  3. ALTER TABLE mytable DROP large_text_column

Для пункта 2 это немногодольше, но это также выполнимо в SQL (я беру пример с вашего поля «Lookup»).Это может быть что-то вроде этого:

  1. Создайте свою «поисковую» таблицу с идентификатором автоинкремента и, например, полем «title» (с УНИКАЛЬНЫМ ИНДЕКСОМ, если вам так хочется).
  2. INSERT INTO lookups (title) (SELECT DISTINCT Lookup FROM mytable)
  3. SET foreign_key_checks = 0
  4. ALTER TABLE mytable ADD lookup_id INTEGER UNSIGNED [...], ADD FOREIGN KEY [...]
  5. UPDATE mytable SET lookup_id = (SELECT id FROM lookups WHERE lookup.title = mytable.Lookup
  6. ALTER TABLE mytable DROP Lookup
  7. (по желанию) ALTER TABLE mytable CHANGE lookup_id Lookup [...] (если вы хотите сохранить то же имя)
  8. SET foreign_key_checks = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...