Серия вопросов Mysql 100: что такое буферный пул?

MySQL

Серия вопросов Mysql 100: что такое буферный пул?

вопросжизненный опытКак бы выглядел поток запросов, если бы не было буферного пула?Как буферный пул повышает эффективность записиЦенность грязных страниц?Правила замены страницИтак, какие страницы отсеять?Эпилог

вопрос

  1. Зачем нужен буферный пул?
  2. Почему буферный пул может повысить эффективность чтения и записи?
  3. Что такое попадание в кеш?

жизненный опыт

Прежде чем объяснять Buffer Pool, вам нужно знать некоторые базовые знания:

  1. Механизмы хранения типа InnoDB записывают данные на диск. (По умолчанию после Mysql 5.6.6) InnoDB берет таблицу как единое целое, генерирует файлы с именем таблицы .frm и именем таблицы .idb и сохраняет их в соответствующем каталоге хранилища Mysql.
  2. InnoDB считывает данные из файлов на диске в память в единицах страниц (обычно размером 16 КБ). Страница содержит несколько записей (минимум 2 записи на страницу). Обновления записей также сбрасываются на диск в единицах страниц. Записи на каждой странице отсортированы по размеру индекса.

Как бы выглядел поток запросов, если бы не было буферного пула?

Давайте смоделируем простой сценарий, предположим, что есть таблица school с 1000 единицами данных, а теперь выполним запрос

select  * from school where id = 400

Нам нужно получить всю информацию о школе, чей идентификатор равен 400.

  1. Тогда InnoDB необходимо сначала найти страницу, на которой находится запись с id=400, прочитать эту страницу в память, а затем среди всех записей на этой странице найти запись с id=400 и вернуть ее.
  2. Вывести результат клиенту и освободить память.

После запроса id = 400 пришел другой оператор запроса:

select  * from school where id = 401

Таким образом, Innodb должен снова выполнить описанный выше процесс, найти соответствующую страницу на диске, поместить ее в память и освободить память после нахождения результата.
Затем, анализируя описанный выше процесс, мы можем знать, что каждый поиск будет выполнять дисковый ввод-вывод, а скорость дискового ввода-вывода намного меньше скорости вычислений ЦП и памяти.
за避免Для каждого поиска требуется дисковый ввод-вывод, поэтому InnoDB представилBuffer Pool 来充当缓存``.
Таким образом, процесс запроса становится:

  • доBuffer PoolНайдите страницу, на которой находится запись с id= 400. Если страница существует, напрямую запросите запись и верните ее. Если страницы не существует, прочитайте ее с диска, поместите в буферный пул и верните запись .

(Это процесс, который мы обычно используем Redis в качестве кеша. Сначала определите, существует ли ключ, если он существует, прочитайте запись и верните ее. Если он не существует, запросите базу данных, сохраните запись в Redis и верните запись.)

Функция буферного пула заключается в кэшировании «страниц», сокращении дискового ввода-вывода и повышении эффективности чтения и записи.

Как буферный пул повышает эффективность записи

Теперь нам нужно изменить имя, предположим, что исходный ID = 400 называется "aa"

update school set name = 'xs' where id = 400

Поток оператора обновления:

  1. Узнайте, находится ли страница данных в буферном пуле, и если она существует, обновите память напрямую. Если он не существует, прочитайте данные с диска в буферный пул, а затем обновите его. (Этот процесс фактически включает в себя наличие неуникального индекса в таблице и буфера изменений.)
  2. Запишите обновленное содержимое в журнал повторов (Что такое журнал повторов? Для чего он нужен? Выкопайте яму и заполните ее позже.)

В описанном выше процессе проблем не обнаружено, мы знаем, что буферный пул — это часть пространства памяти, мы изменили записи в буферном пуле, но并没有把记录重新写回到磁盘文件середина. То есть информация, записанная на диске в это время, и информация, записанная в буферном пуле.信息是不一致из.
В этом примере имя школы записи, соответствующее id=400 на диске, по-прежнему «aa», а соответствующее имя в пуле буферов — «xs».

Информация, записанная на диск, не соответствует информации, записанной буферным пулом, что называется грязной страницей.



Ценность грязных страниц?

Есть ли смысл в несоответствии информации, записываемой диском и буферным пулом? Давайте подумаем об этой ситуации, например, нам нужно обновить пакет данных пакетами.

update school set name = 'xs' where id > 400

В это время соответствующая страница в пуле буферов будет найдена и изменена. В примере 600 записей имеют высокую вероятность быть存在在同一页面中из. Как упоминалось выше, записи на странице сортируются по индексу, и обычно страница размером 16 КБ может хранить сотни тысяч записей.
Поскольку не каждое изменение записи будет обновлено на диске, указанный выше оператор обновления экономит много времени, ведь запись данных на диск занимает очень много времени.

Конечно, грязные страницы не могут всегда существовать в пуле буферов, и информация всегда сбрасывается на диск. В противном случае, если возникнет проблема с программой или машина будет выключена, обновленная информация будет потеряна.
Итак, когда информация в буферном пуле будет обновлена ​​на диск?

  • Mysql будет иметь выделенный фоновый поток, который время от времени сбрасывает грязные страницы на диск.
  • Недостаточно места в буферном пуле, грязные страницы будут удалены при удалении из буферного пула.
  • Когда журнал повторов заполнен
  • Когда база данных закрывается в обычном режиме.

Правила замены страниц

Буферный пул — это часть пространства памяти, зависящая от размера пространства памяти. Размер пула буферов можно контролировать с помощью innodb_buffer_pool_size. Поэтому количество страниц, хранящихся в буферном пуле, также ограничено. Предположим, буферный пул может хранить только 1000 страниц, и он полон. Затем, если записей следующего запроса нет в этих 1000 страниц, нужно прочитать соответствующие страницы с диска и загрузить их в Buffer Pool. Поскольку буферный пул заполнен, одну из страниц необходимо удалить, прежде чем можно будет вставить новую страницу.

Итак, какие страницы отсеять?

Мы знаем, что если запись запрашивается или изменяется, страница записи уже существует в пуле буферов, что эффективно повышает эффективность. Идеальная ситуация заключается в том, что каждый раз, когда осуществляется доступ к странице, она уже существует в пуле буферов, что мы называем попаданием в кеш. Алгоритм исключения страниц имеет решающее значение для частоты попаданий в кэш.
Поскольку правила удаления кеша буферного пула более сложны, об этом будет рассказано в отдельной статье. Основная идея состоит в том, чтобы исключить страницы, которые использовались реже всего, что является алгоритмом LRU (наименее недавно использовавшиеся).

Эпилог

  • Буферный пул — это часть пространства памяти. Загрузка страниц в буферный пул может сократить дисковый ввод-вывод и повысить эффективность запросов.
  • Каждое обновление сначала обновляет запись в пуле буферов и помечает страницу, хранящую запись, как грязную страницу. Фоновые процессы регулярно сбрасывают грязные страницы на диск, чтобы повысить эффективность дискового ввода-вывода. Внедрение буферного пула повышает эффективность чтения и записи.
  • Частота попаданий в кэш отражает эффективность использования буферного пула. Буферный пул использует алгоритм LRU для исключения страниц, чтобы повысить частоту попаданий в кэш.

Если вам нравится и поддерживаете, пожалуйста, обратите внимание на следующий личный публичный номер, спасибо.