Использование памяти для хранения строк как varchar в MySQL - PullRequest
3 голосов
/ 26 декабря 2011

Я начал очень интересоваться использованием памяти MySQL.Итак, я смотрю на это здесь:

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

Я очень взволнован перспективой экономии памяти, например, при использовании только подписанного smallint, где я использовал unsignedво многих местах.Затем я прочитал о varchars ...

"VARCHAR (M) - Длина + 1 байт, если значения столбца требуют 0 - 255 байт"

Что?! Теперь этоМне кажется, что хранение одного varchar израсходовало бы столько памяти, что я мог бы даже не волноваться из-за int и smallint, потому что он сильно затенен полем varchar.Поэтому я прихожу сюда с вопросом, правда ли это, потому что этого просто не может быть?Действительно ли вархары такие ужасные?Или я действительно не должен быть взволнован моим открытием smallint?

edit: Извините!Я должен был быть более ясным.Итак, допустим, я храню varchar с 7 символами, то есть 8 байтами.Это значит, что он использует то же самое, что и число, хранящееся в столбце BIGINT?Это то, что меня беспокоит.

Ответы [ 2 ]

10 голосов
/ 26 декабря 2011

Это говорит о том, что для данной длины строки объем используемой памяти равен длине строки в байтах плюс один байт, чтобы сообщить MySQL, какова длина строки.

Так, например, слово «автомобиль» имеет длину 10 байт (по 1 на каждый символ), поэтому, если оно хранится в столбце varchar, оно займет 11 байт. 1 для числа 10 и 1 для каждого из символов в строке.

Из ссылки, которую вы разместили: http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

Требования к хранению зависят от следующих факторов:

- Фактическая длина значения столбца

- Максимально возможная длина столбца

- Набор символов, используемый для столбца, поскольку некоторые наборы символов содержат многобайтовые символы

Например, столбец VARCHAR (255) может содержать строку с максимальной длиной 255 символов. Предполагая, что в столбце используется набор символов latin1 (один байт на символ), фактическая требуемая память - это длина строки (L) плюс один байт для записи длины строки. Для строки 'abcd' L равно 4, а требование к памяти составляет пять байтов. Если один и тот же столбец объявлен для использования двухбайтового набора символов ucs2, то для хранения требуется 10 байтов: длина 'abcd' составляет восемь байтов, а столбцу требуется два байта для хранения длин, поскольку максимальная длина больше 255 (до 510 байт).

1 голос
/ 03 февраля 2015

Хотя я не являюсь администратором базы данных MySQL, похоже, на этот вопрос есть очень простой ответ, и нет необходимости углубляться в размеры хранилища - потому что он НЕ настраивается.

Per Память MySQLдокументация хранения ,

В таблицах MEMORY используется формат хранения строк фиксированной длины.Типы переменной длины, такие как VARCHAR, хранятся с использованием фиксированной длины.

Таким образом, у вас не будет каких-либо конкретных преимуществ при использовании VARCHAR для таблицы, использующей механизм хранения MEMORY, независимо от того, как VARCHAR являетсяхранится в других механизмах хранения, таких как MyISAM или InnoDB.

...