MySQL. Как рассчитать объём таблицы?

229
02 марта 2017, 23:49

Если я правильно понял, то на объём(размер) таблицы, который она занимает на диске компьютера, влияет тип таблицы, тип полей и т.д.

Вопрос
Как рассчитать объём таблицы?
Есть какие-нибудь калькуляторы для этих целей?

Answer 1

Точно объем таблицы можно посчитать только в случае, если размер записи фиксирован. Для этого надо, чтобы:

  1. Все поля записи имели фиксированный размер. char(50) всегда имеет размер 50 байт, в то время как varchar(50) имеет размер от 1 до 51 байт.

  2. Запись не содержала 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 будет хранить их вместе.

READ ALSO
Как связать 3 таблицы в SQL запросе?

Как связать 3 таблицы в SQL запросе?

Здравствуйте, как связать 3 таблицы в SQL запросе ? Имею вот такой запрос(связывает 2 таблицы)

275
MySQL Сортировка в обратном порядке

MySQL Сортировка в обратном порядке

Есть запрос такого вида

292
Android supernova_emoji_library send php

Android supernova_emoji_library send php

здравствуйтеу меня такой вопрос

214
mysql работа с Events

mysql работа с Events

Есть event которые вызывает хранимую процедуруМожно ли передать параметры в евент который в свою очередь передаст их в процедуру?

261