2009-06-23 3 views
1

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

(Side информация: Я никогда не используя «SELECT * ...» Основная таблица имеет много чтения, редко пишу.).

ответ

4

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

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

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

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

2

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

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

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

+0

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

0

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

+0

Поле предназначено для обозначения «изображение имеет версию масштабирования» - оно может быть как ложным, так и истинным, никогда не равным нулю, и является ложным (но известным) для большинства строк на данный момент.Я собираюсь для бит (1), поскольку я слышал это:

 Before MySQL(InnoDB) 5.0.5: BOOL = BIT = TINYINT(1) = 0 to 255 Since MySQL(InnoDB) 5.0.5: BOOL = TINYINT(1) = 0 to 255 BIT(1) = 0 or 1

+0

Быстрое булевское в mysql по-прежнему «varchar (0) NULL», NULL является ложным, а пустой символ «истинным». – soulmerge

1

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

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

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

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

+0

«Если у вас есть столбец, который будет применяться только к определенным строкам, он (вероятно) не будет 3NF, чтобы поместить его в ту же таблицу». Ну, на самом деле это относится ко всем полям. В частности, каждая строка содержит ссылку на изображение, а поле Бит называется «hasLargeVersion», то есть указывает, есть ли изображение с масштабированием. Поскольку в настоящее время я добавляю большие версии к некоторым фотографиям, значение будет равно 0 для большинства и 1 для некоторых изображений (но никогда не null). PS: Вызывается таблицей «больше», которая пытается означать «довольно большой, но не большой» :) –

+1

Тогда она должна быть в той же таблице, если она соответствует другим критериям 3NF - должна зависеть от ключа (1NF), целого ключ (2NF) и ничего, кроме ключа (3NF), так что помогите мне Codd :-) – paxdiablo