Mysql столбец с нулевыми значениями - каковы требования к пространству? - PullRequest
0 голосов
/ 20 декабря 2010

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

Так что мне интересно, лучше ли создать отдельную таблицу, где я связываю записи в отношении 1: 1.

Iзнаю, что одно целочисленное значение занимает 4 байта в mysql / myisam.Если у меня в столбце разрешены пустые значения, и только 100 из 100 000 строк имеют заполненное поле, остальные будут по-прежнему использовать 4 байта для каждого нулевого значения?

Или mysql достаточно интеллектуален, чтобы установить значениегде он заселен и просто расценивает все как ноль, где ничего не установлено?

Ответы [ 3 ]

1 голос
/ 20 декабря 2010

Это зависит от значения ROW_FORMAT, которое вы даете при создании таблицы.

До версии 5.0.3 формат по умолчанию установлен на «REDUNDANT»: любое поле фиксированной длины будет использовать одинаковое пространство, даже если его значение равно NULL.

Начиная с версии 5.0.3, значение установлено в "КОМПАКТ": значения NULL никогда не будут использовать пробелы в вашей базе данных.

Вы можете сделать ALTER TABLE, чтобы убедиться, что используете правильный формат:

ALTER TABLE ... ROW_FORMAT=COMPACT

Подробнее здесь: http://dev.mysql.com/doc/refman/5.1/en/data-size.html

0 голосов
/ 20 декабря 2010

Он будет использовать битовые поля для хранения нулей, поэтому может потребоваться менее одного байта. Но, даже если это так - кого это волнует, если только вы не используете 3,5-дюймовые дискеты для хранения своего бэкенда; -)

NULL в MySQL (производительность и хранение)

0 голосов
/ 20 декабря 2010

Насколько я понимаю, когда вы объявите поле как int, для него будет выделено 4 байта. Таким образом, для 100 000 строк вы ищете ~ 400 КБ пространства.

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

...