Вот еще некоторая информация, которая может оказаться полезной.
InnoDB распределяет данные в терминах страниц по 16 КБ, поэтому «SHOW TABLE STATUS» выдаст завышенные числа для размера строки, если у вас всего несколько строк, а таблица <16K. (Например, при 4 строках средний размер строки возвращается как 4096). </p>
Дополнительные 6 байтов в строке для "невидимого" первичного ключа являются критической точкой, когда большое значение имеет пространство. Если в вашей таблице только один столбец, это идеальный столбец для создания первичного ключа, если предположить, что значения в нем уникальны:
CREATE TABLE `mytest2`
(`num1` int(10) unsigned NOT NULL primary key)
ENGINE=InnoDB DEFAULT CHARSET=latin1;
Используя ПЕРВИЧНЫЙ КЛЮЧ, как это:
- Никакое предложение INDEX или KEY не требуется, потому что у вас нет вторичного индекса. Упорядоченный по индексу формат таблиц InnoDB обеспечивает быстрый быстрый поиск на основе значения первичного ключа бесплатно.
- Вы не получите другую копию данных столбца NUM1, что происходит, когда этот столбец индексируется явно.
- Вы не получите еще одну копию 6-байтовых значений невидимого первичного ключа. Значения первичного ключа дублируются в каждом вторичном индексе. (Это также причина, по которой вам, вероятно, не нужны 10 индексов для таблицы с 10 столбцами, и вам, вероятно, не нужен первичный ключ, который объединяет несколько различных столбцов или является столбцом длинной строки.)
Таким образом, в целом, использование только первичного ключа означает меньше данных, связанных с таблицей + индексы. Чтобы получить представление об общем размере данных, мне нравится работать с
set innodb_file_per_table = 1;
и проверьте размер файла data / database / * table * .ibd. Каждый файл .ibd содержит данные для таблицы InnoDB и все связанные с ней индексы.
Чтобы быстро создать большую таблицу для тестирования, я обычно запускаю следующую инструкцию:
insert into mytest
select * from mytest;
Что удваивает объем данных каждый раз. В случае таблицы с одним столбцом, использующей первичный ключ, поскольку значения должны были быть уникальными, я использовал вариант, чтобы значения не сталкивались друг с другом:
insert into mytest2
select num1 + (select count(*) from mytest2) from mytest2;
Таким образом, я смог уменьшить средний размер строки до 25. Служебные расходы основаны на базовом предположении, что вы хотите быстро найти отдельные строки с помощью механизма в стиле указателя, и большинство таблиц будет иметь столбец, значения которого служат указателями (т. е. первичным ключом) в дополнение к столбцам с реальными данными, которые суммируются, усредняются и отображаются.