Размер поля InnoDB против размера файла? - PullRequest
0 голосов
/ 05 июля 2019

Я создал эти таблицы:

create table aca (money TINYINT);
create table acb (money SMALLINT);
create table acc (money INT);
create table acd (money BIGINT);

Я запускал следующие вставки снова и снова, чтобы добавить 9420 строк:

INSERT INTO aca (money) VALUES(7), (8), (9), (10), (12);
INSERT INTO acb (money) VALUES(7), (8), (9), (10), (12);
INSERT INTO acc (money) VALUES(7), (8), (9), (10), (12);
INSERT INTO acd (money) VALUES(7), (8), (9), (10), (12);

Когда я проверяю файлы на сервере, он показывает, что каждая база данных немного больше другой:

-rw-r----- 1 mysql mysql 360448 Jul  5 14:21 aca.ibd
-rw-r----- 1 mysql mysql 376832 Jul  5 14:21 acb.ibd
-rw-r----- 1 mysql mysql 393216 Jul  5 14:21 acc.ibd
-rw-r----- 1 mysql mysql 442368 Jul  5 14:21 acd.ibd

Поскольку каждое поле в два раза больше следующего, я ожидаю, что каждый файл базы данных будет примерно в два раза больше (учитывая небольшую разницу из-за заголовков), но это не так, и вместо того, чтобы быть в два раза больше ( На 100% больше) они на 4-13% больше.

Почему?

1 Ответ

3 голосов
/ 05 июля 2019

Что входит в таблицу InnoDB? Вот приблизительный список:

  • Поскольку у вас нет PRIMARY KEY, добавляется скрытый 6-байтовый номер.
  • Каждому столбцу предшествует длина и нулевая информация. Это может добавить 2 байта на строку в вашем случае.
  • Для каждой строки предусмотрены все виды служебных данных, включая данные о транзакциях и т. Д. Одна оценка составляет 29 байт на строку.
  • BTree заполнен не более чем на 15/16. (15 КБ / 16 КБ).

Между тем удобное правило для типичных определений таблиц заключается в умножении очевидного общего размера столбца на 2–3, чтобы получить размер файла .ibd. Это не работает для вашего случая, потому что у вас есть нереально небольшое количество (1) столбцов.

Рассматривая только основные, постоянные, накладные расходы:

9420 * 16/15 * (29+6) = 351KB

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

Еще одна проблема: в какой-то момент InnoDB захватывает куски пространства («экстенты») размером 4/8/16 МБ (я не уверен, какой это размер). Я полагаю, вы еще не достигли этого. Когда это происходит, вычисления становятся еще более запутанными и трудными для понимания.

Достаточно сказать, что InnoDB сделал несколько компромиссов. Они «тратят» некоторое пространство (иногда много), чтобы сделать обработку проще и быстрее.

Если у вас было PRIMARY KEY, то 15/16 ставится под сомнение. Если вы вставите в порядке PK, то 15/16 палочки. Но если вы вставите случайно, он падает до 69%. Это из-за разбиения блока.

Да, и "большие" столбцы текста / больших двоичных объектов перестают записываться. И ROW_FORMAT добавляет морщины.

И, если бы вы сделали это с MyISAM, вам бы дали загадочные размеры, такие как 75360, 75360, 75360 и 94200. Это гораздо проще объяснить, и, если я правильно понял, очень предсказуемо.

Достаточно смущен?

...