У меня есть таблица с примерно 1 миллиардом строк, и ее 98% чтения интенсивно.
Я пробовал настроить базу данных с разными механизмами хранения (MyISAM и InnoDB)
Затем запустили несколько тестов, чтобы посмотреть производительность.
В предложении where у меня был идентификатор первичного ключа, и казалось, что, поскольку MyISAM Key Cache хранит весь индекс в своем буфере, использование MyISAM показалось довольно быстрым, примерно в 2 раза быстрее, чем InnoDB
Но для InnoDB это казалось медленнее !! Дело в том, что InnoDB не использует буфер для предварительной загрузки индексов?
Прежде чем вы выберете MyISAM или InnoDB, вам нужно будет просмотреть оба механизма хранения с точки зрения того, что каждый кэширует.
При чтении индексы таблицы MyISAM могут быть прочитаны один раз из файла .MYI и загружены в кэш ключей MyISAM (размер key_buffer_size). Как сделать так, чтобы .MYD таблицы MyISAM читались быстрее? С этим:
ALTER TABLE mytable ROW_FORMAT=Fixed;
Я писал об этом в своих прошлых постах
Sep 20, 2011
: https://dba.stackexchange.com/questions/5974/best-of-myisam-and-innodb/6008#6008 (Пожалуйста, прочтите это сначала)May 10, 2011
: https://dba.stackexchange.com/questions/2640/what-is-the-performance-impact-of-using-char-vs-varchar-on-a-fixed-size-field/2643#2643 (ТОРГОВЛЯ №2)Aug 12, 2011
: https://dba.stackexchange.com/questions/4576/which-dbms-is-good-for-super-fast-reads-and-a-simple-data-structure/4589#4589 (Пункт 3)Jan 03, 2012
: https://dba.stackexchange.com/questions/10069/optimized-my-cnf-for-high-end-and-busy-server/10080#10080 (Под заголовком Репликация)Хорошо, а что насчет InnoDB? Делает ли InnoDB дисковый ввод-вывод для запросов? Удивительно, но да !! Вы, наверное, думаете, что я сошел с ума, сказав это, но это абсолютно верно, даже для запросов SELECT. В этот момент вы, вероятно, задаетесь вопросом: «Как InnoDB выполняет дисковый ввод-вывод для запросов?»
Все восходит к тому, что InnoDB был КИСЛОТА-Жалоба Transactional Storage Engine. Чтобы InnoDB был транзакционным, он должен поддерживать I
в ACID
, то есть Изоляция. Техника обеспечения изоляции для транзакций осуществляется через MVCC, мультиверсионный контроль параллелизма. Проще говоря, 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 очень важна в соответствии с потребностями вашей базы данных.