MyISAM для чтения данных

10

У меня есть таблица с около 1 миллиарда строк, и она 98% интенсивно читается.

Я попытался настроить базу данных с различными механизмами хранения (MyISAM и InnoDB)

Затем провел несколько тестов для просмотра производительности

В предложении where у меня был идентификатор первичного ключа, и казалось, что, поскольку MyISAM Key Cache хранит все индексы в своем буфере, использование MyISAM оказалось довольно быстрым, примерно в 2 раза быстрее, чем InnoDB

Но для InnoDB это казалось медленнее! Разве InnoDB не использует буфер для предварительной загрузки индексов?

Акаша
источник
может быть, кто-нибудь из довольных модераторов, голосующих за закрытие вопроса, может уточнить их мотивы?
pqd
Можете ли вы дать нам некоторое представление о размере базы данных и таблицы? Общий размер на диске будет полезен. Кроме того, на какой спецификации вы работаете?
Дейв Рикс,

Ответы:

6

Прежде чем вы решите использовать MyISAM или InnoDB, вам нужно просмотреть оба механизма хранения с точки зрения того, что каждый из них кэширует.

MyISAM

При чтении индексы таблицы MyISAM могут быть прочитаны один раз из файла .MYI и загружены в кэш ключей MyISAM (по размеру key_buffer_size ). Как вы можете сделать .MYD таблицы MyISAM быстрее для чтения? С этим:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Я писал об этом в моих прошлых постах

InnoDB

ОК, а как насчет InnoDB? InnoDB выполняет дисковый ввод-вывод для запросов? Удивительно, но да! Вы, наверное, думаете, что я схожу с ума от таких слов, но это абсолютно верно, даже для запросов SELECT . В этот момент вы, вероятно, задаетесь вопросом "Как в мире InnoDB выполняет дисковый ввод-вывод для запросов?"

Все это восходит к InnoDB, являющемуся ACID- жалобой Transactional Storage Engine. Для того чтобы InnoDB был транзакционным, он должен поддерживать Iin ACID, то есть Isolation. Техника для поддержания изоляции для транзакций осуществляется через MVCC, Multiversion Concurrency Control . Проще говоря, InnoDB записывает, как выглядят данные до того, как транзакции пытаются их изменить. Где это записывается? В системном файле табличного пространства, более известном как ibdata1. Это требует дискового ввода-вывода .

СРАВНЕНИЕ

Поскольку и InnoDB, и MyISAM выполняют дисковый ввод-вывод, какие случайные факторы определяют, кто быстрее?

  • Размер столбцов
  • Формат столбца
  • Наборы символов
  • Диапазон числовых значений (требующих достаточно больших INT)
  • Ряды разбиваются по блокам (цепочка строк)
  • Фрагментация данных, вызванная DELETEsиUPDATEs
  • Размер первичного ключа (InnoDB имеет кластерный индекс, требующий двух ключевых запросов)
  • Размер записей индекса
  • список можно продолжить ...

Эпилог

Таким образом, в среде с интенсивным чтением таблица MyISAM с фиксированным форматом строки может превзойти чтения InnoDB из пула буферов InnoDB, если в журналы отмены, содержащиеся в ibdata1, записано достаточно данных для поддержки поведения транзакций. накладывается на данные InnoDB. Тщательно планируйте типы данных, запросы и механизм хранения. Как только данные растут, их перемещение может стать очень трудным.

Кстати, я написал что-то вроде этого 5 дней назад: как назначить лимит памяти для mySQL?

RolandoMySQLDBA
источник
действительно ли innodbe генерирует какие-либо операции чтения с диска, когда все данные уже находятся в пуле буферов и нет одновременных запросов на изменение данных, только чтение?
pQd
Я предполагаю, что, поскольку у запрашивающего есть 1 миллиард строк в его БД, он вряд ли будет иметь все кэшированные в ОЗУ в пуле буферов - следовательно, будут чтения, необходимые для доступа к данным вне буферного пула и на диске?
Дэйв Рикс
3

MyISAM всегда будет работать намного быстрее, чем innodb, когда нет конкуренции за данные. Начните добавлять несколько сеансов, пытаясь обновить одну и ту же таблицу, и innodb очень быстро получит преимущество в производительности.

То, как вы настраиваете систему для двух двигателей, сильно отличается.

Причина существования разных механизмов заключается в том, что существуют разные рабочие нагрузки / шаблоны доступа.

symcbean
источник
2

Вы должны «разогреть» innodb. например, путем повторного воспроизведения журналов доступа или выполнения некоторых интеллектуальных запросов, которые будут касаться каждого значения из индекса.

посмотрите здесь или здесь .

я надеюсь, что вы не используете настройки mysql по умолчанию для innodb - они подходят для оборудования с ~ 2000 года.

PQD
источник
Я внес изменения в конфигурацию по умолчанию, также выполнял запрос несколько раз, примерно 30 раз, но получал почти одинаковые результаты. Он был быстрее после нескольких попыток, но оставался медленнее, чем MYISAM, также использовал MariaDB (последняя версия)
Akash
1

Проверьте этот сайт, он имеет очень полезную информацию:

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)

klocek
источник
0

После дальнейшей настройки InnoDB на MariaDB я увеличил innodb_buffer_pool_sizeразмер базы данных InnoDB, так как при этом InnoDB начал извлекать строки быстрее

Я полагаю, настройка InnoDB очень важна в соответствии с потребностями вашей базы данных.

Акаша
источник