Кажется, я не могу найти приятного ответа на этот вопрос в Интернете на этот конкретный вопрос: «В MySQL есть ли столбцы, которые имеют« пустую »пустую память»? - PullRequest
0 голосов
/ 04 августа 2010

Взято из одного из моих предыдущих вопросов.

В таблице указывается, по какому пункту (посту, фотографии или ответу) происходит комментарий.


commentid ---- postid ----- photoid-----replyid
-----------------------------------------------
1                22          NULL        NULL
2                NULL         56         NULL
3                23          NULL        NULL
4                NULL        NULL        55
5                26          NULL        NULL
...
...
...

Это плохо?

Ответы [ 4 ]

2 голосов
/ 04 августа 2010

Это зависит от механизма хранения и полностью зависит от указанного механизма хранения.

Например, в MyISAM, значение NULL или нет, не занимает больше места и не экономит место.

В InnoDB, если столбец равен NULL, его значение вообще не нужно хранить, поэтому он экономит место.Объем сэкономленного пространства равен размеру, который заняло бы значение, если бы оно было там.

Более подробная информация содержится в этом ответе .

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

0 голосов
/ 04 августа 2010

Зависит от того, что вы подразумеваете под отходами.Создание столбца NULLable означает, что должен быть сохранен какой-то нулевой указатель, я не уверен насчет MySql, но в других СУБД я знаю его smallint, где «1» указывает на ноль, а «0» указывает на наличие значения.

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

0 голосов
/ 04 августа 2010

Лучшая структура была бы ...

commentid  itemid  itemtype
---------------------------
1          22      post
2          56      photo
3          23      post
4          55      reply
5          26      post

Вы даже можете добавить индекс, который объединяет столбцы itemid и itemtype, чтобы быстро найти все комментарии для определенного элемента.

0 голосов
/ 04 августа 2010

Это так.Я не знаю, сколько и если это действительно так актуально, но никогда не бывает хорошо иметь слишком много NULL-записей.

...