2013-11-21 2 views
0

Немного смущен и нужен некоторый ввод.Использование PRIMARY KEY снижает размер файла innodb?

Я создал 2 таблицы здесь

CREATE TABLE `table1` (
    `Id` int(11) NOT NULL AUTO_INCREMENT, 
    `Value` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`Id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `table2` (
    `Value` varchar(45) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Когда я смотрю на размер файла в папке временных. Они оба 96 кб

enter image description here

Я просто вставляется 10240 элементы в обеих колонках.

SELECT count(*) FROM temp.table1; 
SELECT count(*) FROM temp.table2; 

дает

10240 
10240 

Если я теперь посмотрим на размер таблиц, это то, что я получаю.

enter code here

Я обнаружил это, когда я изменил один из моих таблиц InnoDB и добавил AUTO_INCREMENT PRIMARY KEY, а размер был более 3 Гб меньше.

У меня сложилось впечатление, что innodb имеет внутренний PRIMARY KEY в случае, если один не определен? Но как может быть, что таблица с 1 столбцом меньше, на самом деле занимает больше места? Там нет индекса в table2 (кроме внутреннего PRIMARY KEY), и PRIMARY KEY определяется на table1

Означает ли это, что внутренний InnoDB PK использует BIGINT например?

EDIT

После изменения PK в BIGINT, размеры файлов теперь одинаковы. Просто как тот.

Это, однако, вызывает другой вопрос. Является ли ПРЕДОСТЕРЕЖЕНИЕ MySQL строк максимум BIGINT (это большой да, но на самом деле есть предел, а затем правый)?

+0

Что произойдет, если вы снова сбросите ключ? Становится ли оно больше или оно остается маленьким? MySQL в основном воссоздает всю таблицу для такого изменения, чтобы она могла реорганизовать данные в процессе, в результате чего файл сжимался. – GolezTrol

+0

Кстати, 3 ГБ меньше по файлу 400 КБ? Возможно, вы имели в виду: «30KB less»? – GolezTrol

+0

Внутренняя внутренняя схема POS имеет тип BIGINT, поэтому размер был другим. Но это создает для меня еще один вопрос относительно LIMIT для MySQL –

ответ

1

Возможно, этот ответ не то, что вы хотите. Но если вы ищете, как уменьшить размер файла данных InnoDB, формат Barracuda может вам помочь. (если вы уже знаете об этом, я удалю этот ответ). Формат Barracuda сжимает файл данных InnoDB

Давайте посмотрим, как его использовать. первая проверка ток innodb_file_format:

mysql> show variables like 'innodb_file_format'; 
+--------------------+-----------+ 
| Variable_name  | Value  | 
+--------------------+-----------+ 
| innodb_file_format | Barracuda | 
+--------------------+-----------+ 

По умолчанию значения innodb_file_format является Antelope, если вы хотите использовать Barracuda, добавьте innodb_file_format = barracuda в my.cnf и перезагрузку. Это все.

Теперь Barracuda включен, поэтому при создании таблицы вы можете указать KYE_BLOCK_SIZE (значение по умолчанию - 16 КБ). Если вы установите значение 8 Кбайт, размер таблицы уменьшится до 1/2 по сравнению с 16 КБ. если 4 КБ или 2 КБ, 1/4 и 1/8 соответственно.

CREATE TABLE temp(...) 
ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8; 

Но KEY_BLOCK_SIZE=8 рекомендуется. 4 или 2 хороши для размера файла, но производительность плохая. но 8 сокращается на 50% без потери производительности.

+0

Спасибо за ваш вклад. В настоящий момент дисковое пространство не является проблемой, все еще получающей 4 T. Но это значит, чтобы размер файлов был неправильным? Знаете ли вы, влияет ли это на размер индексов? –

+1

@KayNelson Да, уменьшает как индекс, так и данные. фактически Barracuda уменьшает InnoDB Страница. и InnoDB Page имеет индекс и данные. (не как MYISAM MYD, MYI) –

+0

Jungsu благодарит много за ваш вклад. Я немедленно погружусь в это и узнаю больше о баракуде. Im работает Antilope atm. Еще раз спасибо! –