MySQL вставляет против myisam - PullRequest
5 голосов
/ 17 марта 2012

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

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 17 марта 2012

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

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

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

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

InnoDB-буфер бассейн размером

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

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

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

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

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

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

1 голос
/ 17 марта 2012

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

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

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

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

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

0 голосов
/ 17 марта 2012

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

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

...