mysql innodb против вставок myisam

У меня есть таблица с 17 миллионами строк. Мне нужно взять 1 столбец этой таблицы и вставить все это в другую таблицу. Вот что я сделал:

INSERT IGNORE INTO table1(name) SELECT name FROM main WHERE ID < 500001

InnoDB выполняется примерно за 3 минуты 45 секунд.

Однако MyISAM выполняется чуть менее 4 секунд. В чем разница?

Я вижу, что все хвалят InnoDB, но, честно говоря, я не понимаю, чем это лучше для меня. Это намного медленнее. Я понимаю, что это здорово для целостности и еще много чего, но многие из моих таблиц не будут обновлены (просто прочтите). Стоит ли вообще возиться с InnoDB?


person nick    schedule 16.03.2012    source источник
comment
Я использую InnoDB только тогда, когда работаю с реляционными таблицами. В противном случае, если у вас нет внешних ключей, я предпочитаю MyISAM!   -  person Ben Ashton    schedule 17.03.2012
comment
просто отметим, что на обеих таблицах есть указатели. основная таблица в настоящее время myisam.   -  person nick    schedule 17.03.2012
comment
Бен, я бы хотел использовать реляционные таблицы, но я буду иметь дело, возможно, с сотнями миллионов строк - мне тоже нужно проиндексировать десятки столбцов, поэтому я не знаю, в каком направлении двигаться. целостность не является большой проблемой. не для этой части по крайней мере.   -  person nick    schedule 17.03.2012
comment
@BenAshton: Таблицы MyISAM тоже реляционные, они просто не транзакционные.   -  person a_horse_with_no_name    schedule 17.03.2012
comment
@nick: MyISAM резко остановится, когда у вас будет много одновременных операций чтения и записи.   -  person a_horse_with_no_name    schedule 17.03.2012
comment
@a_horse_with_no_name Я никогда не говорил, что таблицы MyISAM не могут быть реляционными. Я просто сказал, что предпочитаю использовать их для реляционных таблиц. Это был комментарий, а не ответ!   -  person Ben Ashton    schedule 17.03.2012
comment
@BenAshton: Но ваш комментарий звучит так, будто вы не видите таблицы MyISAM как реляционные.   -  person a_horse_with_no_name    schedule 17.03.2012


Ответы (3)


Разница, скорее всего, связана с настройкой innoDB, которая требует немного большей настройки, чем myISAM. Идея innoDB состоит в том, чтобы хранить большую часть ваших данных в памяти и сбрасывать / читать на диск только тогда, когда у вас есть несколько свободных циклов процессора.

стоит ли вообще возиться с InnoDB - действительно хороший вопрос. Если вы собираетесь продолжать использовать MySQL, настоятельно рекомендуется получить некоторый опыт работы с InnoDB. Но если вы быстро делаете грязную работу для базы данных, которая не будет видеть большой трафик и не беспокоиться о масштабировании, тогда простота MyISAM может быть для вас просто победой. InnoDB может быть излишним во многих случаях, когда кому-то просто нужна простая база данных.

но многие из моих таблиц не будут обновляться

Вы все еще можете получить повышение производительности от InnoDB, если вы читаете на 99%. Если вы сконфигурируете размер пула буферов для хранения всей базы данных в памяти, InnoDB НИКОГДА не придется обращаться к диску для получения ваших данных, даже если он пропускает кеш запросов mysql. В MyISAM есть большая вероятность, что вам нужно прочитать строку с диска, и вы оставляете операционную систему для кэширования и оптимизации за вас.

innodb-buffer-pool-size

Мое первое предположение - проверить innodb_buffer_pool_size, который поставляется из коробки с установленным значением 8M. Рекомендуется, чтобы это было около 80% вашей общей памяти. Как только вы достигнете этого предела, производительность innodb значительно упадет, потому что ему нужно очистить что-то из буфера, чтобы освободить место для новых данных, что может быть дорогостоящим.

autocommit = 0
Кроме того, убедитесь, что автоматическая фиксация отключена при загрузке таблицы, иначе сброс будет происходить при каждой вставке. Вы можете снова включить его после того, как закончите, и это настройка на стороне клиента. очень безопасно.

Загрузка таблиц обычно происходит один раз
Подумайте, действительно ли вы хотите настроить свою базу данных для «вставки 17 миллионов строк». Как часто вы это делаете? MyISAM может быть быстрее в этом случае, но когда у вас есть 100 одновременных подключений, которые читают и изменяют эту таблицу одновременно, вы обнаружите, что хорошо настроенный innoDB победит, а MyISAM задохнется от блокировок таблицы.

Как MyISAM видит эту операцию
MyISAM отлично справляется с этой задачей без какой-либо настройки, потому что вы просто добавляете каждую строку в файл (и обновляете индекс). Ваша ОС и дисковое кэширование решат все эти проблемы с производительностью.

Как InnoDB видит эту операцию
Innodb узнает, что таблица нуждается в записи, поэтому бросает строку в буфер вставки. Вы не даете ему времени до следующей вставки, поэтому innoDB не успевает разобраться с буфером, ему не хватает места, и он вынужден «задерживать» вставку, пока он записывает в пул буферов и обновляет индексы. Затем ваш пул буферов заполняется, и innoDB вынужден «задерживать» вставку и сбрасывать некоторую страницу из пула буферов на диск. И продолжаешь как сумасшедший кидать в него вставки. Обратите внимание, что когда вы настраиваете InnoDB так, чтобы он очень быстро выдавал вам приглашение MySQL> после того, как вы это сделаете, InnoDB по-прежнему будет скремблироваться под крышками, чтобы наверстать упущенное в свободное время, но будет готов выполнить новую транзакцию за вас.

ДОЛЖЕН ПРОЧИТАТЬ:
http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/
http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html (см. советы по массовой загрузке данных)

person FlipMcF    schedule 16.03.2012
comment
Пожалуйста, любые эксперты по производительности MySQL (особенно из Percona) могут исправить меня, если я ошибся или что-то упустил. Обновлю ответ. - person FlipMcF; 17.03.2012
comment
Немного неточно с достижением предела размера innodb-buffer-pool-size. Промывка на самом деле связана с попаданием в innodb_max_dirty_pages_pct. Но я полагаю, что это ответ на этот вопрос. - person FlipMcF; 17.03.2012
comment
Также удачного чтения: mysqlperformanceblog.com/2007/05/24/ - person FlipMcF; 19.03.2012

Вы говорите прямо до некоторой степени. InnoDB медленнее MyISAM, но в каких случаях? Не все создано для удовлетворения всех требований. INNODB - это механизм транзакционной базы данных, а MyISAM - нет. Следовательно, чтобы сделать его механизм хранения с учетом требований ACID и транзакций, мы должны оплатить его стоимость в виде времени отклика.

Более того, InnoDB работает быстрее, если он правильно настроен с помощью my.ini или другого файла конфигурации.

В конце концов, я могу понять следующие причины, по которым люди хвалят InnoDB:

  1. Это ACID-совместимый движок, поддерживающий транзакции.
  2. При работе с таблицей требуется блокировка на уровне строк, в то время как MyISAM принимает блокировки на уровне таблицы.
  3. InnoDB легко настраивается для многоядерных / многопроцессорных машин для улучшения параллелизма.

Последний, но не менее важный комментарий с моей стороны; что угодно может удовлетворить потребности «всех», поэтому все зависит исключительно от сценария, в котором вы сравниваете оба движка.

person Mian Zeshan Farooqi    schedule 16.03.2012

Посмотрите сравнение MYISAM и Innodb в Википедии.

http://en.wikipedia.org/wiki/Comparison_of_MySQL_database_engines

person Teja    schedule 16.03.2012