SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.09.2012 22:11:55

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Ограничения Innodb и MyISAM

Никак не разберусь с ограничениями. У меня есть небольшая старая 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;

Что я не так делаю?

Неактивен

 

#2 02.09.2012 22:32:48

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ограничения Innodb и MyISAM

barracuda использует 20-байтовые указатели (см. http://dev.mysql.com/doc/refman/5.6/en/ … ssion.html ). Можно попробовать использовать Percona Server и увеличить размер страницы ( http://www.percona.com/doc/percona-serv … xtend.html )

Неактивен

 

#3 02.09.2012 23:49:35

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Ограничения Innodb и MyISAM

Спасибо, не знал..., а 20 байтами можно адресовать 1208925819614629174706176 йоттабайт..., что-то они перегнули.
Percona пока ставить не осмелюсь.

Отредактированно gif-t (03.09.2012 00:12:27)

Неактивен

 

#4 03.09.2012 00:11:43

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ограничения Innodb и MyISAM

gif-t написал:

Спасибо, не знал..., а 20 байтами можно адресовать 1208925819614629174706176 йоттабайт..., что-то они перегнули.
Percona пока ставить не осмелюсь, посижу на MyIsam, пока этот баг не поправят

Я не знаю всех архитектурных решений - почему 20 байт и почему не более, чем полстраницы под строку. Может быть кто-то знакомый с внутренним миром InnoDB прокомментирует. Наверное 8 байт под адрес, еще сколько-то под длину и еще место под информацию, связанную с версионностью.

Неактивен

 

#5 03.09.2012 00:12:32

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Ограничения Innodb и MyISAM

У меня еще такой вопрос, можно ли как-то сделать две таблицы так, чтобы можно было работать с ними как с одной, чтобы в ней были поля обеих? Не охото всё переписывать и увеличивать количество запросов...

Отредактированно gif-t (03.09.2012 00:24:52)

Неактивен

 

#6 03.09.2012 00:35:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ограничения Innodb и MyISAM

Можно создать 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 ), так что нельзя будет обновлять или вставлять в обе таблицы одним запросом.

Неактивен

 

#7 03.09.2012 14:11:01

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Ограничения Innodb и MyISAM

Почитал в интернете немногочисленные обсуждения по проблеме, и в некоторых люди утверждают что если в таблице более 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)

Неактивен

 

#8 03.09.2012 15:57:17

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ограничения Innodb и MyISAM

Насчет ошибки архитектуры - у людей разные архитектурные вкусы. Все зависит от того, что строите.

Варианты решения вы все назвали, выбирайте, что лучше по производительности подойдет.

Неактивен

 

#9 03.09.2012 22:43:36

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Ограничения Innodb и MyISAM

Я склоняюсь ко второму варианту...
Подскажите пожалуйста, как будет выглядеть запрос на выборку из такой базы:

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 ?

Неактивен

 

#10 03.09.2012 23:57:32

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ограничения Innodb и MyISAM

SELECT t1.prof1, t3.prof3 FROM table1 t1 JOIN table2 t2 USING(id) WHERE t1.id=1;

Неактивен

 

#11 04.09.2012 01:46:11

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Ограничения Innodb и MyISAM

Прошу прощения, что снова пишу, прямо напасть какая-то, в innodb у партиций указал DATA DIRECTORY, но партиции всеравно создались в основной папке базы. Как перевожу таблицу в Myisam, партиции сразу создаются там, куда указывает DATA DIRECTORY, т.е. проблема пропадает. А на innodb всеравно партиции размещаются в оснойной папке базы. Пробовал конвертировать и заполнять таблицу, не помогает.
И я опять не знаю в каком направлении капать... подскажите пожалуйста, что это может быть?

Неактивен

 

#12 04.09.2012 14:55:16

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ограничения Innodb и MyISAM

InnoDB не поддерживает DATA DIRECTORY. Используйте символические ссылки, см. http://stackoverflow.com/questions/4511 … irectories

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson