Если я правильно понял, то на объём(размер) таблицы, который она занимает на диске компьютера, влияет тип таблицы, тип полей и т.д.
Вопрос
Как рассчитать объём таблицы?
Есть какие-нибудь калькуляторы для этих целей?
Ответ
Точно объем таблицы можно посчитать только в случае, если размер записи фиксирован. Для этого надо, чтобы:
Все поля записи имели фиксированный размер. char(50) всегда имеет размер 50 байт, в то время как varchar(50) имеет размер от 1 до 51 байт.
Запись не содержала NULL-полей.
Размеры типов можно найти в документации по MySQL
Типы nchar, varchar, varbinary, tinyblob, tinytext, blob, text, mediumblob, mediumtext, longblob, longtext не имеют фиксированного размера. Если таблица содержит поля этих типов, точный её размер посчитать невозможно. Иногда размер можно посчитать приблизительно с высокой точностью, если понятно, какие данные будут хранится.
Все остальные типы имеют фиксированный размер. INT 4 байта, это просто. CHAR(7) 7 байт. Размер NUMERIC(12, 3) посчитать сложнее, поскольку MySQL упаковывает каждые 9 десятичных цифр в 4 байта.
Каждая запись содержит служебный заголовок, который имеет размер от 5 байт. Если NULL-поле имеет значение NULL, оно не хранится в записи, просто выставляется бит в заголовке.
После того, как размер таблицы посчитан в байтах, можно прикинуть, сколько она занимает места на диске. Для скорости MySQL хранит данные большими страницами, блоками размером 4Кбайт или 8Кбайт. Если запись с заголовком занимает 100 байт, а размер страницы 4096 байт, то на странице поместится 40 записей и ещё останется 96 пустых байт на каждой странице. 400 записей займут на диске 10 страниц или 40Кбайт.
Помимо данных, таблица содержит индексы, каждый из которых тоже занимает место. Если в индексе встречаются поля типов переменного размера, сам индекс также будет переменного размера.
Не смотря на то, что точный размер таблицы определить трудно, на практике достаточно бывает оценить порядок.
Дополнительно
Когда MySQL хранит текст, то она и цифры хранит как обычные символы. Скажем, в кодировке UTF-8 все цифры занимают один байт, а русские буквы занимают 2 байта. Чтобы считать корректно, необходимо знать, какая кодировка используется для данного поля.
Типы INT и т.д. хранят числа в двоичной системе. INT всегда требует 4 байта, где хранится целое число в интервале -231..231−1.
Тип DECIMAL хранит числа в десятичной системе, используя хитрое кодирование, чтобы упаковывать каждые 3 десятичные цифры в 10 бит (каждые 9 цифр в 4 байта).
Типы BIT(n) упаковываются вместе в достаточное количество байт. BIT(3) всегда будет занимать 1 байт, потому что меньше памяти выделить невозможно. Но два поля по BIT(3) также будут занимать 1 байт, поскольку MySQL будет хранить их вместе.
Комментариев нет:
Отправить комментарий