Хранение данных и индексных данных в памяти - InnoDB против MyISAM

Предположим, что база данных состоит из 1 ГБ данных и 1 ГБ данных индекса.

Чтобы свести к минимуму диск IO и, следовательно, увеличить производительность, я хочу выделить память для MySQL, чтобы весь набор данных, включая индексы, мог храниться в ОЗУ (предположим, что машина имеет ОЗУ в изобилии).

Параметр InnoDB innodb_buffer_pool_size используется для указания размера буфера памяти, который InnoDB использует для кэширования данных и индексов своих таблиц. (Примечание: память используется для индексов данных AND.)

Параметр MyISAM key_buffer_size используется для указания размера буфера памяти, который MyISAM использует для кэширования индексов своих таблиц. (Примечание: для индексов используется ТОЛЬКО).

Если я хочу, чтобы база данных 2 ГБ (данные 1 ГБ и индекс 1 ГБ) вписывалась в память в InnoDB, я бы просто сконфигурировал innodb_buffer_pool_size как 2GB. Два гигабайта будут содержать как данные, так и индекс.

Однако при установке ключа MyISAM key_buffer_size на 2GB это пространство будет использоваться для индекса, но не для данных.

Мои вопросы:

  • Можно ли настроить размер буфера данных MyISAM "(не индексные данные)"?
  • Когда MyISAM будет считывать данные таблицы (исключая данные индекса) с диска и когда он будет считываться из памяти?

Ответ 1

  • Нет MyISAM не имеет кэша данных общего назначения. Это описано в описании "key_buffer_size" из официальной документации: This is because MySQL relies on the operating system to perform file system caching for data reads, so you must leave some room for the file system cache.

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

  • Итак, чтобы ответить на ваш второй вопрос: никогда.

Важно не впадать в "избыточное количество буфера" для разных переменных myisam, таких как read_buffer_size, read_rnd_buffer_size, sort_buffer_size, join_buffer_size и т.д., поскольку некоторые из них динамически распределены, поэтому большее значение не всегда означает более быстрое - и иногда оно может даже быть медленнее - см. этот post в mysqlperformanceblog для очень интересного случая.

Если вы находитесь на 5.1 на платформе posix, вам может понадобиться сравнить myisam_use_mmap с вашей рабочей нагрузкой, которая должна помочь сокращающих количество вызовов malloc().