Хранение данных плюс индексные данные в памяти - InnoDB против MyISAM - PullRequest
11 голосов
/ 07 февраля 2010

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

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

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

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

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

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

Мои вопросы:

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

1 Ответ

12 голосов
/ 13 февраля 2010
  • Нет 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 и т. Д., Поскольку некоторые из них динамически распределяются, поэтому больший размер не всегда означает быстрее - и иногда он может даже будьте медленнее - смотрите этот пост в mysqlperformanceblog для очень интересного случая.

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

...