Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 MYISAM vs INNODB  [new]
clipperx
Member

Откуда:
Сообщений: 10
Раньше использовал таблицы MYISAM для неочень больших таблиц(несколько тысяч записей). Сейчас при проектировании новой базы с встал вопрос о максимальной оптимизации таблиц, т.к. планируются очень большие объемы данных(миллионы записей), с постоянным добавлением и паралельной выборкой. Везде пишут что тип INNODB самый продвинутый в этом плане, решил сделать тест. На практике у меня оказалось совсем наоборот: INNODB нереально долго выполняет INSERT и UPDATE!
На рабочих машинах результаты получились такие:
1)pentium 1.7Ггц; 512Mb
В таблицу INNODB 1000 записей добавляется ~ за 40 сек.
В таблицу MYISAM 1000 записей добавляется ~ за 0.2 сек.
2)celeron 2.4Ггц; 768Mb
В таблицу INNODB 1000 записей добавляется ~ за 4-5 сек.
В таблицу MYISAM 1000 записей добавляется ~ за 1.9 сек.

Вот такая вот разница! ПОЧЕМУ?

MySQL 5.0.17-nt
конфиги вроде дефолтные:
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=8M
innodb_log_file_size=10M
innodb_thread_concurrency=8
пробовал менять размеры памяти - без разницы.

Таблицы такие:
CREATE TABLE `test` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`field1` INT( 11 ) NOT NULL ,
`field2` VARCHAR( 100 ) NOT NULL
) TYPE = innodb;

CREATE TABLE `test2` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`field1` INT( 11 ) NOT NULL ,
`field2` VARCHAR( 100 ) NOT NULL
) TYPE = MYISAM ;

Запрос через php такой:
for ($i=0;$i<1000;$i++)
mysql_query("INSERT INTO test (field1, field2) VALUES (".rand(1,100).", 'abc')");

И еще заметил такое что где-то после добавления 25 тыс. записей в таблицу типа INNODB, количество записей в таблице возвращается неверное!! т.к. я добавлял записи кратные 1000, например phpmyadmin показывает чет нето, т.е. перезагружая страницу с обзором количество записей возвращается разное. при том что с типом MYISAM все было нормально.

Объясните что не так с INNODB?
может версия mysql с ним глюкнуто работает?
или настройки нужны особо тонкие?
или все правильно и INNODB это мазохизм? :)
10 янв 07, 00:51    [3618807]     Ответить | Цитировать Сообщить модератору
 Re: MYISAM vs INNODB  [new]
DocAl
Member

Откуда: Оккупирую западный берег
Сообщений: 10472
1. Дефолтные конфиги, кроме my-innodb-heavy-4G.cnf(ini), выделяют минимальный объём памяти под буфера InnoDB, позволяющие ему как-то функционировать, но, при сколько-нибудь значительном объёме данных в таблицах InnoDB, далеко не оптимально. Пока в ваших тестах на тысячу записей вы вряд ли столкнулись с этим моментом, но, для реального использования этого движка, конфиги надо будет подкорректировать.
2. InnoDB, в отличие от MyISAM транзакционный движок, соответственно, если вы по привычке тупо скармливаете ему 1 000 запросов вставки, не заключив их в одну транзакцию, и не отключив дефолтный автокоммит, он проводит 1 000 транзакций, что, безусловно, негативно сказывается на скорости операций. Попробуйте перед первым INSERT запустить транзакцию через (START [TRANSACTION]), и после последнего запроса её закоммитить.
3. InnoDB, в отличие от MyISAM версионный движок с блокировками уровня строки. Это означает, с одной стороны, что операции с ним требуют бОльших накладных расходов, так что, при прочих равных, 1 000 вставок в InnoDB будут проводиться медленнее, чем 1 000 вставок в MyISAM, с другой же стороны, это означает, что при конкурентной смешанной (INSERT-UPDATE-DELETE/SELECT) нагрузке, первые типы запросов не будут блокировать вторые и друг-друга (если, конечно, относятся к разным записям).
10 янв 07, 01:10    [3618812]     Ответить | Цитировать Сообщить модератору
 Re: MYISAM vs INNODB  [new]
clipperx
Member

Откуда:
Сообщений: 10
Спасибо! теперь разобрался как общаться с InnoDB :)
Скорость стала сравнима с MYISAM хотя прироста пока не заметил.
10 янв 07, 03:36    [3618865]     Ответить | Цитировать Сообщить модератору
 Re: MYISAM vs INNODB  [new]
DocAl
Member

Откуда: Оккупирую западный берег
Сообщений: 10472
Если вы внимательно прочтёте пункт №3, возможно, вы даже поймёте почему...
10 янв 07, 04:57    [3618877]     Ответить | Цитировать Сообщить модератору
 Re: MYISAM vs INNODB  [new]
clipperx
Member

Откуда:
Сообщений: 10
буду разбираться...
нашел вот самые последние тесты производительности mysql(January 8, 2007), может кому еще будет интересно, линк:
http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/
10 янв 07, 11:48    [3620189]     Ответить | Цитировать Сообщить модератору
 Re: MYISAM vs INNODB  [new]
maXmo
Member

Откуда: Моск.
Сообщений: 8541
вообще-то там результаты, специфичные для линуха, а у тебя вынь.
11 янв 07, 12:13    [3626147]     Ответить | Цитировать Сообщить модератору
 Re: MYISAM vs INNODB  [new]
miksoft
Member

Откуда:
Сообщений: 38921
clipperx
планируются очень большие объемы данных(миллионы записей), с постоянным добавлением и паралельной выборкой.
Имхо, тут нет выбора. InnoDB однозначно.
11 янв 07, 12:29    [3626298]     Ответить | Цитировать Сообщить модератору
 Re: MYISAM vs INNODB  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709
DocAl
3. InnoDB, в отличие от MyISAM версионный движок с блокировками уровня строки. Это означает, с одной стороны, что операции с ним требуют бОльших накладных расходов, так что, при прочих равных, 1 000 вставок в InnoDB будут проводиться медленнее, чем 1 000 вставок в MyISAM, с другой же стороны, это означает, что при конкурентной смешанной (INSERT-UPDATE-DELETE/SELECT) нагрузке, первые типы запросов не будут блокировать вторые и друг-друга (если, конечно, относятся к разным записям).


Этот пункт не верен. Но не по сути. По сути Inno действительно должен быть медленнее, но
не за счет версионности, а потому, что это - ТРАНЗАКЦИОННЫЙ движок. Он поддерживает durability и вообще все свойства ACID.

Для меня лично нетранзакционные движки вообще не существуют. Если предполагается хранение больших объемов данных, то вероятно что они все-таки являются ценными и нужно обеспечивать надежность их хранения, чего MyISQL не сможет дать никогда. Так что я бы подумал про Inno.
Или другой транзакционный движок.
11 янв 07, 15:28    [3627879]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить