У меня есть таблица с около 1 миллиарда строк, и она 98% интенсивно читается.
Я попытался настроить базу данных с различными механизмами хранения (MyISAM и InnoDB)
Затем провел несколько тестов для просмотра производительности
В предложении where у меня был идентификатор первичного ключа, и казалось, что, поскольку MyISAM Key Cache хранит все индексы в своем буфере, использование MyISAM оказалось довольно быстрым, примерно в 2 раза быстрее, чем InnoDB
Но для InnoDB это казалось медленнее! Разве InnoDB не использует буфер для предварительной загрузки индексов?
Ответы:
Прежде чем вы решите использовать MyISAM или InnoDB, вам нужно просмотреть оба механизма хранения с точки зрения того, что каждый из них кэширует.
MyISAM
При чтении индексы таблицы MyISAM могут быть прочитаны один раз из файла .MYI и загружены в кэш ключей MyISAM (по размеру key_buffer_size ). Как вы можете сделать .MYD таблицы MyISAM быстрее для чтения? С этим:
Я писал об этом в моих прошлых постах
Sep 20, 2011
: /dba/5974/best-of-myisam-and-innodb/6008#6008 (сначала прочтите это)May 10, 2011
: /dba/2640/what-is-the-performance-impact-of-using-char-vs-varchar-on-a-fixed-size-field/2643#2643 (TRADEOFF # 2)Aug 12, 2011
: /dba/4576/which-dbms-is-good-for-super-fast-reads-and-a-simple-data-structure/4589#4589 (пункт 3)Jan 03, 2012
: /dba/10069/optimized-my-cnf-for-high-end-and-busy-server/10080#10080 (под заголовком Репликация )InnoDB
ОК, а как насчет InnoDB? InnoDB выполняет дисковый ввод-вывод для запросов? Удивительно, но да! Вы, наверное, думаете, что я схожу с ума от таких слов, но это абсолютно верно, даже для запросов SELECT . В этот момент вы, вероятно, задаетесь вопросом "Как в мире InnoDB выполняет дисковый ввод-вывод для запросов?"
Все это восходит к InnoDB, являющемуся ACID- жалобой Transactional Storage Engine. Для того чтобы InnoDB был транзакционным, он должен поддерживать
I
inACID
, то есть Isolation. Техника для поддержания изоляции для транзакций осуществляется через MVCC, Multiversion Concurrency Control . Проще говоря, InnoDB записывает, как выглядят данные до того, как транзакции пытаются их изменить. Где это записывается? В системном файле табличного пространства, более известном как ibdata1. Это требует дискового ввода-вывода .СРАВНЕНИЕ
Поскольку и InnoDB, и MyISAM выполняют дисковый ввод-вывод, какие случайные факторы определяют, кто быстрее?
DELETEs
иUPDATEs
Эпилог
Таким образом, в среде с интенсивным чтением таблица MyISAM с фиксированным форматом строки может превзойти чтения InnoDB из пула буферов InnoDB, если в журналы отмены, содержащиеся в ibdata1, записано достаточно данных для поддержки поведения транзакций. накладывается на данные InnoDB. Тщательно планируйте типы данных, запросы и механизм хранения. Как только данные растут, их перемещение может стать очень трудным.
Кстати, я написал что-то вроде этого 5 дней назад: как назначить лимит памяти для mySQL?
источник
MyISAM всегда будет работать намного быстрее, чем innodb, когда нет конкуренции за данные. Начните добавлять несколько сеансов, пытаясь обновить одну и ту же таблицу, и innodb очень быстро получит преимущество в производительности.
То, как вы настраиваете систему для двух двигателей, сильно отличается.
Причина существования разных механизмов заключается в том, что существуют разные рабочие нагрузки / шаблоны доступа.
источник
Вы должны «разогреть» innodb. например, путем повторного воспроизведения журналов доступа или выполнения некоторых интеллектуальных запросов, которые будут касаться каждого значения из индекса.
посмотрите здесь или здесь .
я надеюсь, что вы не используете настройки mysql по умолчанию для innodb - они подходят для оборудования с ~ 2000 года.
источник
Проверьте этот сайт, он имеет очень полезную информацию:
http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/
http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/
Вы также можете настроить свою файловую систему. У меня хорошие результаты производительности на XFS с оптимальными значениями sunit и swidth (конечно, если вы используете RAID)
источник
После дальнейшей настройки InnoDB на MariaDB я увеличил
innodb_buffer_pool_size
размер базы данных InnoDB, так как при этом InnoDB начал извлекать строки быстрееЯ полагаю, настройка InnoDB очень важна в соответствии с потребностями вашей базы данных.
источник