Буфер записи (буфер изменения), на этот раз я полностью понимаю! ! !

Архитектура

Последняя статьяБуферный пул (buffer pool), полностью разобрался!"Представляет принцип работы буферного пула InnoDB.

Просто резюмирую:

(1) Хранилище данных MySQL включает内存и磁盘две части;

(2) Буферный пул памяти (буферный пул)以页为单位, кэшировать самую горячую страницу данных (страницу данных) и страницу индекса (страницу индекса);

(3) InnoDB управляет пулом буферов с помощью варианта алгоритма LRU и может解决"читать вперед недействительно"и"Загрязнение буферного пула"из问题;

Голос за кадром: Подробнее см.Буферный пул (buffer pool), полностью разобрался!".

без сомнений,对于读请求,缓冲池能够减少磁盘IO, чтобы улучшить производительность. Вот проблема,Как насчет запросов на запись?

Дело 1

Если вы хотите изменить индексную страницу со страницей номер 4, и это页正好在缓冲池内.

Серийные номера 1-2, как показано выше:

(1) Непосредственное изменение страниц в пуле буферов, одна операция с памятью;

(2) Запись журнала повторов, операция последовательной записи на диск;

Этот КПД является самым высоким.

Голос за кадром: Пишите по порядку, как в журнале, десятки тысяч раз в секунду — это не проблема.

Будут ли проблемы с согласованностью?

Нет.

(1) Чтение, попадет на страницу буферного пула;

(2) Когда данные LRU буферного пула удалены, «грязные страницы» будут сброшены обратно на диск;

(3) аварийный сбой базы данных, и данные можно восстановить из журнала повторов;

Когда страницы буферного пула будут сброшены на диск?

定期刷磁盘, вместо того, чтобы каждый раз сбрасывать диск, это может уменьшить дисковый ввод-вывод и повысить производительность MySQL.

*画外音:批量写,是常见的优化手段。*

Случай 2

Если вы хотите изменить индексную страницу со страницей номер 40, и это页正好**不**在缓冲池内.

На данный момент это немного более хлопотно, как показано на рисунке выше, требуется 1-3:

(1) Сначала загрузите индексную страницу, которая должна быть 40, с диска в пул буферов и выполните операцию произвольного чтения с диска;

(2) изменение страниц в пуле буферов, одна операция с памятью;

(3) Запись журнала повторов, операция последовательной записи на диск;

Когда буферный пул не поражен,Создайте хотя бы один дисковый ввод-вывод, для бизнес-сценария больше писать и меньше читать,Есть ли еще возможности для оптимизации?

Именно эту проблему рассматривает InnoDB, и именно о буфере записи (буфере изменений) пойдет речь в этой статье.

*画外音:从名字容易看出,写缓冲是降低磁盘IO,提升数据库写性能的一种机制。* Что такое буферизация записи InnoDB?

До MySQL 5.5 назывался插入缓冲(буфер вставки), оптимизированный только для вставки; теперь также действителен для удаления и обновления, называемого写缓冲(изменить буфер).

Это приложение внеуникальная нормальная индексная страница(неуникальная страница вторичного индекса) не находится в пуле буферов, страница записывается, и страница диска не будет загружаться в пул буферов сразу, а записываются только изменения буфера (изменения буфера), и когда данные читается в будущем, Техника слияния данных обратно в буферный пул. буферизация записиЦельда降低写操作的磁盘IO,提升数据库性能。

*画外音:R了狗了,这个句子,好长。*

InnoDB добавляет оптимизацию буфера записи Что произойдет с описанным выше процессом «случай 2»?

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

После добавления оптимизации буфера записи оптимизация процесса выглядит следующим образом:

(1) Запишите эту операцию в буфер записи, операцию памяти;

(2) Запись журнала повторов, операция последовательной записи на диск;

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

*画外音:可以看到,40这一页,并没有加载到缓冲池中。*

Будут ли проблемы с согласованностью?

И не будет.

(1) Ненормальный сбой базы данных, и данные можно восстановить из журнала повторов;

(2) Буфер записи — это не просто структура памяти, он также периодически сбрасывается в системное табличное пространство буфера записи;

(3) Когда данные считываются, выполняется еще один процесс объединения данных в пул буферов;

Можно предположить, что позже будет запрос на запрос данных индексной страницы 40.

В настоящее время процесс выглядит как порядковый номер 1-3:

(1) При загрузке индексной страницы буферный пул не затрагивается, на этот раз дисковый ввод-вывод неизбежен;

(2) прочитать соответствующую информацию из буфера записи;

(3) Восстановить индексную страницу и поместить ее в буферный пул LRU;

*画外音:可以看到,40这一页,在真正被读取时,才会被加载到缓冲池中。*

Есть еще одна проблема упущения,Почему оптимизация буфера записи применяется только к неуникальным обычным индексным страницам?

В InnoDB сходства и различия между кластеризованным индексом и обычным индексом (вторичным индексом), "1 минута, чтобы понять разницу между индексами MyISAM и InnoDB.» имеет подробное описание и не будет расширяться.

Если для индекса задан уникальный (уникальный) атрибут, InnoDB должен выполнить проверку уникальности при выполнении операции модификации. То есть, даже если страница индекса не находится в пуле буферов, чтения страницы на диске не избежать (иначе, как проверить, уникальна ли она?), в это время следует непосредственно поставить соответствующую страницу в пул буферов, а затем изменен, а не весь буфер записи мотылек.

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

Также есть несколько случаев, когда данные в буфере будут сброшены:

(1) Существует фоновый поток, который будет думать, что база данных простаивает;

(2) Когда пула буферов базы данных недостаточно;

(3) Когда база данных нормально закрыта;

(4) Когда журнал повторов заполнен;

*画外音:几乎不会出现redo log写满,此时整个数据库处于无法写入的不可用状态。*

Какие бизнес-сценарии подходят для включения механизма буферизации записи InnoDB?

Сначала скажите, когда это не подходит, как проанализировано выше, когда:

(1) База данных представляет собой уникальный индекс;

(2) Или, после записи данных, они будут немедленно прочитаны;

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

Когда уместно использовать буферизацию записи, если:

(1) Большинство баз данных не являются уникальными индексами;

(2) Дело в том, чтобы больше писать и меньше читать или не читать сразу после написания;

Буферизация записи может использоваться для оптимизации регулярной пакетной записи SQL, которая требует дискового ввода-вывода каждый раз при записи.

*画外音:例如,账单流水业务。*

Каким параметрам соответствуют вышеуказанные принципы в InnoDB? **

Есть еще два важных параметра.

Параметры: innodb_change_buffer_max_size

Введение: Настройте размер буфера записи, который составляет долю всего пула буферов.Значение по умолчанию — 25%, максимальное значение — 50%.

*画外音:写多读少的业务,才需要调大这个值,读多写少的业务,25%其实也多了。*

Параметры: innodb_change_buffering

вводить: Настройте, какие операции записи включают буферизацию записи, которая может быть установлена ​​на все/нет/вставки/удаления и т. д.

Я надеюсь, что у вас есть урожай,идеиважнее заключения.