Последняя статьяБуферный пул (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
вводить: Настройте, какие операции записи включают буферизацию записи, которая может быть установлена на все/нет/вставки/удаления и т. д.
Я надеюсь, что у вас есть урожай,идеиважнее заключения.