Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Есть таблица на 1158 строки:
CREATE TABLE `EXXXXX` (
`id1` tinyint(3) unsigned NOT NULL,
`id2` mediumint(8) unsigned NOT NULL DEFAULT '0',
`id3` mediumint(8) unsigned NOT NULL DEFAULT '0',
`id4` tinyint(3) unsigned NOT NULL,
`p0` blob NOT NULL,
`p1` blob NOT NULL,
`p2` blob NOT NULL,
`p3` blob NOT NULL,
`p4` blob NOT NULL,
`p5` blob NOT NULL,
`p6` blob NOT NULL,
`p7` blob NOT NULL,
`p8` blob NOT NULL,
`p9` blob NOT NULL,
PRIMARY KEY (`id2`,`id3`,`id4`,`id1`) KEY_BLOCK_SIZE=16
) ENGINE=InnoDB DEFAULT CHARSET=ascii ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=2;
Занимает 186,55 MB.
Перевожу её на движок MyISAM:
CREATE TABLE `EXXXXX_copy` (
`id1` tinyint(3) unsigned NOT NULL,
`id2` mediumint(8) unsigned NOT NULL DEFAULT '0',
`id3` mediumint(8) unsigned NOT NULL DEFAULT '0',
`id4` tinyint(3) unsigned NOT NULL,
`p0` blob NOT NULL,
`p1` blob NOT NULL,
`p2` blob NOT NULL,
`p3` blob NOT NULL,
`p4` blob NOT NULL,
`p5` blob NOT NULL,
`p6` blob NOT NULL,
`p7` blob NOT NULL,
`p8` blob NOT NULL,
`p9` blob NOT NULL,
PRIMARY KEY (`id2`,`id3`,`id4`,`id1`) KEY_BLOCK_SIZE=1024
) ENGINE=MyISAM DEFAULT CHARSET=ascii ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=2;
Размер становится 28,70 MB, т.е. уменьшается в 6,5 раз. Так и должно быть?
Таблицы могу слить на файлообменник
Отредактированно gif-t (29.11.2014 19:00:29)
Неактивен
В описанном примере размер таблицы уменьшается при переходе на MyISAM что совсем не эквивалентно увеличению при переходе на InnoDB
http://sqlinfo.ru/forum/viewtopic.php?pid=34391#p34391
И к вопросу о размере InnoDB таблиц
http://sqlinfo.ru/forum/viewtopic.php?id=3481
Неактивен
vasya написал:
В описанном примере размер таблицы уменьшается при переходе на MyISAM что совсем не эквивалентно увеличению при переходе на InnoDB
Я пробовал переводить InnoDB -> MyISAM -> InnoDB. Делал optimize table. Всё равно файл на жестком диске у InnoDB в 7 раз больше.
На странице http://sqlinfo.ru/forum/viewtopic.php?id=3481 я нашел:
paulus написал:
Место, занимаемое таблицей, равно месту, которое занимают данные (Data_length),
индексы (Index_length), и месту, которое резервирует хранилище под расширение
таблицы (оно пишется в комментарии — InnoDB free: xxx kB).
Я правильно понимаю что надо смотреть на параметр Data_free? У меня он 0. Но если даже это неверное значение и движок на самом деле резервирует места в 7 раз больше, в таком случае логичным будет если размер файла таблицы не увеличится при вставке еще одной строки. Ведь в файле таблицы в таком случае зарезервировано места еще на 6500 тысяч строк. А размер при вставке увеличивается.
EXXXXX_InnoDB
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 498 (на самом деле 1000)
Avg_row_length: 167426
Data_length: 83378176 (79,52 MB)
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2014-11-30 12:33:06
Update_time: NULL
Check_time: NULL
Collation: ascii_general_ci
Checksum: NULL
Create_options: row_format=DYNAMIC KEY_BLOCK_SIZE=2
EXXXXX_MyISAM
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 1000
Avg_row_length: 12608
Data_length: 12608756 (12,02 MB)
Max_data_length: 281474976710655
Index_length: 16384
Data_free: 0
Auto_increment: NULL
Create_time: 2014-11-29 20:08:47
Update_time: 2014-11-29 20:08:47
Check_time: NULL
Collation: ascii_general_ci
Checksum: NULL
Create_options: row_format=DYNAMIC KEY_BLOCK_SIZE=2
Для проверки я увеличил количество строк в 2 раза, до 2000. Размер таблицы InnoDB удвоился и стал 157,55 MB (165 199 872). Т.е. на движке innodb размер таблицы всегда в 6.5 раз больше, чем на MyISAM и я не понимаю почему? Согласитесь, разница в цене на ssd между 256 Гб и 2 Тб довольно велика..., полнейший абсурд
EXXXXX_InnoDB_2000
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 983 (на самом деле 2000)
Avg_row_length: 168056
Data_length: 165199872 (157,55 MB)
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2014-11-30 12:51:14
Update_time: NULL
Check_time: NULL
Collation: ascii_general_ci
Checksum: NULL
Create_options row_format=DYNAMIC KEY_BLOCK_SIZE=2
InnoDB: http://rghost.ru/59332840
MyISAM: http://rghost.ru/59332879
Отредактированно gif-t (30.11.2014 12:07:06)
Неактивен
А какая суммарная длина всех хранимых блобов SUM(LENGTH(p0))+SUM(LENGTH(p1))+...? Сколько строк в таблице?
Неактивен
А как будет выглядеть запрос для структуры:
CREATE TABLE `EXXXXX_MyISAM` (
`id1` tinyint(3) unsigned NOT NULL,
`id2` mediumint(8) unsigned NOT NULL DEFAULT '0',
`id3` mediumint(8) unsigned NOT NULL DEFAULT '0',
`id4` tinyint(3) unsigned NOT NULL,
`p0` blob NOT NULL,
`p1` blob NOT NULL,
`p2` blob NOT NULL,
`p3` blob NOT NULL,
`p4` blob NOT NULL,
`p5` blob NOT NULL,
`p6` blob NOT NULL,
`p7` blob NOT NULL,
`p8` blob NOT NULL,
`p9` blob NOT NULL,
PRIMARY KEY (`id2`,`id3`,`id4`,`id1`) KEY_BLOCK_SIZE=1024
) ENGINE=MyISAM DEFAULT CHARSET=ascii ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=2;
Строк: 1000 (см. прошлое сообщение)
Вот дампы табличек:
InnoDB: http://rghost.ru/59332840
MyISAM: http://rghost.ru/59332879
Отредактированно gif-t (30.11.2014 12:54:39)
Неактивен
Каждый BLOB, не помещающийся в запись, будет храниться в отдельной странице хранилища, которая занимает 16k. Получается 10 блобов x 1000 строк x 16k = 160M. В перконе можно поменять размер страницы, но это тяжелая операция, которая делает его бинарно не совместимым.
http://www.percona.com/blog/2010/02/09/ … in-innodb/
Another thing to beware with Innodb BLOB storage is the fact external blob pages are not shared among the blobs. Each blob, even if it has 1 byte which does not fit on the page will have its own 16K allocated. This can be pretty inefficient so I’d recommend avoiding multiple large blobs per row when possible. Much better decision in many cases could be combine data in the single large Blob (and potentially compress it)
Неактивен
Спасибо, это всё объясняет
Неактивен
Страниц: 1