Использование InnoDB на диске - PullRequest
5 голосов
/ 29 июля 2011

У меня есть таблица, которая содержит два 32-битных целых числа.Эти два целых числа используются для создания кластеризованного индекса.SQL для создания таблицы выглядит следующим образом:

CREATE TABLE `a` (
  `var1` int(10) unsigned NOT NULL,
  `var2` int(10) unsigned NOT NULL,
  PRIMARY KEY (`var2`,`var1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
  • В этой таблице 6921338 строк (получено с помощью SELECT COUNT(*) FROM a)
  • Таблица использует 358580224 байта пространства(получено с помощью SHOW TABLE STATUS)

Согласно моим расчетам, каждая строка использует 51,8 байта.Я знаю, что InnoDB имеет накладные расходы при хранении строк .Однако, используя веб-сайт MySQL, я подсчитал, что размер строки должен составлять 26 байт (5-байтовый заголовок, 8 байт для целых чисел, 6-байтовый идентификатор транзакции и 7-байтовые поля указателя ролла).уменьшить размер строки, потому что таблица может заполняться до 160 миллиардов записей.

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

Обновление

Запросы, которые я делаю для этой таблицы;

INSERT INTO a(var1,var2) VALUES(INTEGER,INTEGER),(INTEGER,INTEGER),...,(INTEGER,INTEGER);
SELECT var1 FROM a WHERE var2=INTEGER;
DELETE FROM a WHERE var2=INTEGER;

1 Ответ

4 голосов
/ 29 июля 2011

Это потому, что созданный вами индекс также занимает место. В случае кластеризованного индекса в InnoDB данные строки фактически сохраняются внутри конечных узлов индекса, поэтому при использовании индекса индекс не указывает на строку, а вместо этого указывает на конечный узел индекса, который содержит данные строки вдоль с PKEY.

Это привело к тому, что хранилище стало намного больше.

Взгляните сюда

...