Стоит ли избегать добавления еще одного поля в большую таблицу MySQL? - PullRequest
1 голос
/ 23 июня 2009

У меня есть таблица MySQL-InnoDB с 350 000+ строками, содержащая пару вещей, таких как id, otherId, shortTitle и так далее. Теперь мне нужно поле Bool / Bit для пары сотен или тысяч этих строк. Должен ли я просто добавить это bool-поле в таблицу или лучше создать новую таблицу, ссылающуюся на идентификаторы старой таблицы - тем самым не рискуя вызвать проблемы с производительностью для всех старых существующих функций, которые обращаются к первой таблице?

(Дополнительная информация: я никогда не использую "SELECT * ...". В основной таблице много чтения, редко пишу.)

Ответы [ 4 ]

4 голосов
/ 23 июня 2009

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

Скорее всего, у вас будет ровно столько же строк на странице, что означает отсутствие снижения производительности вообще.

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

Я бы добавил столбец прямо в таблицу.

2 голосов
/ 23 июня 2009

Что обозначает новый столбец?

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

Реально, влияние на производительность добавления нового столбца в таблицу с ~ 350 000 не будет особенно огромным. Вы пытались выдать оператор ALTER TABLE для копии, возможно, на локальной рабочей станции?

1 голос
/ 23 июня 2009

Я не знаю, почему люди настаивают на больших таблицах с 350K-строками. В мире мэйнфреймов вот такие большие таблицы конфигурации СУБД: -).

Тем не менее, вы должны разрабатывать свои таблицы в третьей нормальной форме. Если и только если у вас есть проблемы с производительностью, вы должны рассмотреть вопрос о нормализации.

Если у вас есть столбец, который будет применяться только к определенным строкам, он (вероятно) не будет 3NF, чтобы поместить его в ту же таблицу. У вас должна быть отдельная таблица с внешним ключом в вашей «основной» таблице.

Имейте в виду, что если логическое поле не применяется к некоторым строкам. Это другая ситуация с полем, применяемым ко всем строкам, но для некоторых оно неизвестно. В этом случае столбец с нулем в первичной таблице будет лучше. Но это не похоже на то, что вы описываете.

0 голосов
/ 23 июня 2009

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

...