Задавайте вопросы, мы ответим
Вы не зашли.
Никак не разберусь с ограничениями. У меня есть небольшая старая MyISAM таблица на 430 blob полей. Поскольку дальше она будет увеличиваться, а MyISAM не позволяет впихнуть много полей, решил перевести её в Innodb. Прописал использование самого нового формата barracuda. При конвертации выводит следующее:
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs
Хотя по логике считаем размер указателя в 64 разрядной системе 8 байт, что дает суммарный размер 3440...
Конвертирую командой:
ALTER TABLE `table` ENGINE=InnoDB;
Что я не так делаю?
Неактивен
barracuda использует 20-байтовые указатели (см. http://dev.mysql.com/doc/refman/5.6/en/ … ssion.html ). Можно попробовать использовать Percona Server и увеличить размер страницы ( http://www.percona.com/doc/percona-serv … xtend.html )
Неактивен
Спасибо, не знал..., а 20 байтами можно адресовать 1208925819614629174706176 йоттабайт..., что-то они перегнули.
Percona пока ставить не осмелюсь.
Отредактированно gif-t (03.09.2012 00:12:27)
Неактивен
gif-t написал:
Спасибо, не знал..., а 20 байтами можно адресовать 1208925819614629174706176 йоттабайт..., что-то они перегнули.
Percona пока ставить не осмелюсь, посижу на MyIsam, пока этот баг не поправят
Я не знаю всех архитектурных решений - почему 20 байт и почему не более, чем полстраницы под строку. Может быть кто-то знакомый с внутренним миром InnoDB прокомментирует. Наверное 8 байт под адрес, еще сколько-то под длину и еще место под информацию, связанную с версионностью.
Неактивен
У меня еще такой вопрос, можно ли как-то сделать две таблицы так, чтобы можно было работать с ними как с одной, чтобы в ней были поля обеих? Не охото всё переписывать и увеличивать количество запросов...
Отредактированно gif-t (03.09.2012 00:24:52)
Неактивен
Можно создать VIEW ( http://dev.mysql.com/doc/refman/5.0/en/create-view.html ) на JOIN двух таблиц. Для SELECT это будет работать как одна таблица, но на UPDATE будут ограничения ( http://dev.mysql.com/doc/refman/5.5/en/ … ility.html ), так что нельзя будет обновлять или вставлять в обе таблицы одним запросом.
Неактивен
Почитал в интернете немногочисленные обсуждения по проблеме, и в некоторых люди утверждают что если в таблице более 200 полей - это явная ошибка архитектуры. Какая именно ошибка не уточняется, но я подумал о возможных вариантах решения проблемы, и пока нашел только 4:
- оставит таблицу MyISAM, но т.к. идут постоянные update, уже сейчас чуствуются подвисания из-за блокировок. К тому же она тоже не безграничная.
- сделать много Innidb таблиц, но это увеличит нагрузку вцелом, т.к. выборки будут происходить уже из нескольких таблиц. + придется переписывать очень много кода и запросов, можно понаделать много ошибок.
- у меня в mysql хранится 40 массивов по 10 элементов каждый, что в сумме дает 400 полей. Можно слить элементы в одно поле и получить вместо 400 полей - 40, но в таком случае чтобы вынуть один элемент массива, придется вынимать все 10. Изменение одного элемента массива будет невозможно выполнить одним апдейтом, нужно будет вынимать все 10, в приложении изменять/заполнять элемент, опять преобразовывать в строку и заносить обратно в поле базы. Это несомненно увеличит нагрузку на винчестер.
- innodb_page_size, в 5.6.4 позволяет только уменьшать размер, в percona никаких гарантий правильной работы не дается. К тому же увеличивается размер страницы не только структуры таблицы, но и данных, что в частности для SSD очень плохо.
Какой вариант выбрали бы вы?
Отредактированно gif-t (03.09.2012 14:25:03)
Неактивен
Насчет ошибки архитектуры - у людей разные архитектурные вкусы. Все зависит от того, что строите.
Варианты решения вы все назвали, выбирайте, что лучше по производительности подойдет.
Неактивен
Я склоняюсь ко второму варианту...
Подскажите пожалуйста, как будет выглядеть запрос на выборку из такой базы:
CREATE TABLE `table1` (
`id` int(1) unsigned NOT NULL DEFAULT '0',
`prof1` mediumblob NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
CREATE TABLE `table2` (
`id` int(1) unsigned NOT NULL DEFAULT '0',
`prof2` mediumblob NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
CREATE TABLE `table3` (
`id` int(1) unsigned NOT NULL DEFAULT '0',
`prof3` mediumblob NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
Если мне нужно, к примеру, вынуть prof1 из table1 и prof3 из table3, из строк, у которых id=1 ?
Неактивен
Неактивен
Прошу прощения, что снова пишу, прямо напасть какая-то, в innodb у партиций указал DATA DIRECTORY, но партиции всеравно создались в основной папке базы. Как перевожу таблицу в Myisam, партиции сразу создаются там, куда указывает DATA DIRECTORY, т.е. проблема пропадает. А на innodb всеравно партиции размещаются в оснойной папке базы. Пробовал конвертировать и заполнять таблицу, не помогает.
И я опять не знаю в каком направлении капать... подскажите пожалуйста, что это может быть?
Неактивен
InnoDB не поддерживает DATA DIRECTORY. Используйте символические ссылки, см. http://stackoverflow.com/questions/4511 … irectories
Неактивен