Буферный пул — это непрерывная область памяти в механизме хранения InnoDB, используемая для кэширования страниц данных и индексных страниц на диске. Поскольку доступ к памяти происходит намного быстрее, чем доступ к диску, загрузка часто используемых данных и индексов в пул буферов может значительно улучшить производительность чтения и записи базы данных. Принцип работы буферного пула в основном основан на принципах «временной локальности» и «пространственной локальности», то есть к данным, к которым недавно осуществлялся доступ, скорее всего, в будущем снова будет осуществлен доступ, и когда осуществляется доступ к элементу данных, его соседние элементы данных также могут быть доступны снова.
Изображение ниже представляет собой оригинальное изображение с официального сайта MySQL, на котором показан состав буферного пула в архитектуре движка innodb.
Подробное объяснение компонентов буферного пула
В механизме хранения MySQL InnoDB пул буферов (Buffer Pool) представляет собой ключевую структуру памяти, используемую для кэширования данных и индексов для сокращения операций ввода-вывода на физических дисках. Вот подробное объяснение некоторых важных компонентов буферного пула:
На индексной странице хранится индексная структура таблицы InnoDB, включая индекс первичного ключа (кластеризованный индекс) и вспомогательный индекс (некластеризованный индекс). Эти индексные страницы загружаются в пул буферов, чтобы ускорить поиск и доступ к данным в таблице. При выполнении операции запроса InnoDB сначала проверяет, находится ли требуемая индексная страница уже в буферном пуле. Если это так, она будет прочитана непосредственно из буферного пула. Это называется попаданием в буферный пул. для загрузки с диска. В пуле буферов это называется промахом пула буферов.
На странице данных хранятся фактические строки данных таблицы InnoDB. В InnoDB данные хранятся на страницах, и каждая страница данных обычно содержит несколько строк данных. Когда данные в таблице необходимо прочитать или изменить, соответствующие страницы данных загружаются в пул буферов. Кэшируя страницы данных в памяти, InnoDB может быстро читать и изменять данные без необходимости каждый раз загружать их с диска.
На странице «Отменить» хранятся старые версии данных и используется для поддержки изоляции, устойчивости (Isolation) и долговечности (Durability) свойств ACID транзакций. При выполнении транзакции изменение данных не вступит в силу немедленно, но сначала будет записано на странице «Отменить». Если другим транзакциям необходимо прочитать измененные данные, они могут получить версию до изменения данных через страницу «Отменить», тем самым реализуя управление многоверсионным параллелизмом (MVCC). Кроме того, если транзакция завершается неудачно или происходит ее откат, данные на странице «Отменить» можно использовать для восстановления данных до состояния, существовавшего до начала транзакции.
Кэширование вставки — это механизм, используемый в InnoDB для оптимизации операций вставки некластеризованного индекса. При вставке данных в таблицу, содержащую некластеризованный индекс, если соответствующая страница индекса не находится в пуле буферов, InnoDB не будет немедленно вставлять ключ индекса в страницу индекса, а сохранит его в кеше вставки. Когда связанные страницы индекса загружаются в пул буферов, ключи индекса, вставленные в кэш, объединяются и вставляются в страницу индекса. Это сокращает операции дискового ввода-вывода и повышает производительность операций вставки.
Следует отметить, что кэш вставки применяется только к операциям вставки в неуникальные индексы, а в некоторых случаях, например, когда пул буферов достаточно велик или таблица мала, кэш вставки может не использоваться.
Адаптивные хеш-индексы — это функция механизма хранения InnoDB, которая автоматически создает хэш-индексы на основе шаблонов доступа. Когда к определенным значениям индекса обращаются часто, InnoDB сохраняет эти значения индекса в адаптивных хеш-индексах, чтобы ускорить поиск этих значений. Адаптивные хэш-индексы полностью автоматические и не требуют ручного создания или обслуживания пользователем. Когда хеш-индексы больше не используются часто, InnoDB автоматически удаляет их, чтобы освободить память.
Механизм хранения InnoDB использует блокировки для обеспечения согласованности и целостности данных во время одновременного доступа. В пуле буферов InnoDB хранит информацию о блокировке, чтобы отслеживать, какие страницы или строки данных заблокированы, а также тип блокировки (например, общие или монопольные блокировки). Эта информация о блокировке имеет решающее значение для обеспечения изоляции транзакций и управления параллелизмом. Когда транзакция пытается получить доступ к данным, заблокированным другой транзакцией, она решает, ждать ли снятия блокировки или немедленно вернуть ошибку, в зависимости от типа блокировки и уровня изоляции транзакции.
Вместе эти компоненты буферного пула работают вместе, обеспечивая эффективный доступ к данным и возможности обработки транзакций. Путем правильной настройки и управления размером пула буферов и использованием компонентов можно дополнительно оптимизировать производительность и скорость ответа MySQL.
Когда сервер базы данных MySQL запускается, механизм хранения InnoDB выполнит ряд операций инициализации, включая инициализацию пула буферов. Основной поток процесса инициализации выглядит следующим образом:
Благодаря такому процессу инициализации и управления InnoDB Buffer Pool может эффективно кэшировать «горячие» данные в базе данных, сокращать операции дискового ввода-вывода и тем самым улучшать общую производительность базы данных. В реальных приложениях администраторы баз данных могут регулировать размер пула буферов и другие связанные параметры в соответствии с требованиями к рабочей нагрузке и производительности для достижения оптимальной производительности.
Блок управления буферным пулом — важная структура в механизме хранения InnoDB для управления страницами кэша. Чтобы лучше управлять страницами кэша, InnoDB создает отдельную область для каждой страницы кэшированных данных — блок управления. Этот блок управления используется для записи информации метаданных страницы данных, в основном включая следующие аспекты:
Между блоком управления и страницей кэша существует взаимно однозначное соответствие, и они оба хранятся в пуле буферов. Размер каждого управляющего блока обычно составляет около 5% страницы кэша, что составляет около 800 байт (при размере страницы кэша по умолчанию 16 КБ). При запуске сервера MySQL процесс инициализации пула буферов будет завершен, а используемое пространство памяти будет разделено на несколько управляющих блоков и страниц кэша. В это время блок управления записывает соответствующий адрес страницы кэша, и страница кэша находится в состоянии пустых данных.
С помощью блоков управления InnoDB может эффективно управлять страницами кэша в буферном пуле, обеспечивая быстрый доступ к данным и обработку транзакций.
В механизме хранения MySQL InnoDB буферный пул — это область памяти, используемая для кэширования данных и индексов для сокращения операций ввода-вывода на диске. Чтобы лучше управлять страницами кэша в этой области памяти, InnoDB использует три важных связанных списка: связанный список LRU, свободный связанный список и очищенный связанный список. Ниже приводится подробное объяснение этих трех связанных списков:
Связанный список LRU является наиболее важным связанным списком в пуле буферов и используется для управления последовательностью доступа и стратегией удаления страниц кэша. Ее название «Наименее недавно использованная» означает, что страница, использовавшаяся реже всего, будет удалена. Но на самом деле алгоритм LRU InnoDB — это улучшенная версия, которая разделена на две части: молодое поколение (молодой подсписок) и старое поколение (старый подсписок).
молодое поколение:Недавно загружено вBuffer Страницы пула в первую очередь будут ориентированы на молодое поколение. Если к странице обращаются несколько раз за короткий период времени среди молодого поколения, она считается «горячей» страницей и передается старшему поколению.
старость:старостьсерединахранится, считается“горячий”страница кэша,эти страницысуществовать Часто посещали в последнее время。когдаBuffer Когда пулу требуется место для загрузки новых страниц, он удаляет страницы старого поколения.
Эта стратегия генерации может гарантировать, что «горячие» страницы останутся в буферном пуле в течение более длительного периода времени, тем самым улучшая скорость попадания в кеш.
Свободный связанный список используется для управления свободными страницами, которые в данный момент не используются в пуле буферов. Когда страница удаляется из списка LRU или других связанных списков, она добавляется в свободный список. Когда новую страницу необходимо загрузить в пул буферов, InnoDB сначала получит бесплатную страницу из свободного связанного списка. Если список свободных пуст, InnoDB необходимо удалить страницы из списка LRU, чтобы освободить место.
Связанный список очистки используется для управления страницами кэша, которые были изменены (т. е. «грязными страницами») и должны быть сброшены на диск. Когда транзакция зафиксирована или в буферном пуле недостаточно свободного места, InnoDB выберет несколько грязных страниц для добавления в список очистки и сбросит их на диск в подходящее время. Связанный список очистки гарантирует, что грязные страницы могут быть удалены в определенном порядке и приоритете, тем самым обеспечивая постоянство и согласованность данных.
Таким образом, эти три связанных списка играют разные роли в буферном пуле:
Связанный список LRU:Управляйте последовательностью доступа и стратегией удаления страниц кэша.,Убедитесь, что «горячие» страницы кэшируются в течение длительного периода времени.
бесплатный связанный список:Управление неиспользуемыми бесплатными страницами,Обеспечьте место для загрузки новых страниц.
очистить связанный список:Управляйте грязными страницами, которые необходимо сбросить на диск.,Гарантированная долговечность и согласованность данных.
Благодаря использованию и взаимодействию этих трех связанных списков InnoDB может эффективно управлять страницами кэша в буферном пуле и повышать производительность и скорость ответа базы данных.
1. Загрузка и кэширование данных
При выполнении операции CRUD система базы данных сначала проверяет, находится ли требуемая страница данных уже в буферном пуле. Если страница данных отсутствует в буферном пуле (то есть промах в кэше), система считывает соответствующую страницу данных с диска и загружает ее в свободную страницу кэша в буферном пуле. Этот процесс включает в себя чтение данных с диска в память. Поскольку доступ к памяти происходит намного быстрее, чем к диску, скорость доступа к данным можно значительно повысить за счет кэширования.
2. Модификация данных
Для операций добавления, удаления и изменения система базы данных будет напрямую изменять соответствующую страницу кэша в буферном пуле, а не немедленно записывать ее обратно на диск. Это связано с тем, что операции модификации в памяти выполняются очень быстро и могут значительно увеличить вычислительную мощность базы данных. Измененные страницы кэша помечаются как «грязные страницы», что означает, что их содержимое не синхронизировано с данными на диске.
3. Запись на диск
Грязные страницы не записываются обратно на диск немедленно, а сбрасываются на диск асинхронно фоновым процессом в соответствующее время. Эта стратегия отложенной обратной записи может сократить операции ввода-вывода на диске и повысить производительность системы. Однако, чтобы обеспечить надежность и согласованность данных, система базы данных принудительно запишет «грязные» страницы обратно на диск при определенных обстоятельствах (например, при фиксации транзакции).
4. Стратегия замены кэша
Поскольку размер буферного пула ограничен, необходима стратегия, позволяющая решить, какие данные следует заменить или удалить при использовании всех страниц кэша. Наиболее распространенной стратегией является алгоритм «наименее недавно использовавшийся» (LRU), который определяет, какие страницы следует удалить, в зависимости от того, как часто они используются. Однако системы баз данных часто вносят некоторые изменения в стандартный алгоритм LRU, чтобы адаптироваться к своим конкретным моделям доступа и требованиям к производительности.
5. Управление параллелизмом
Когда несколько пользователей одновременно обращаются к базе данных, буферный пул также должен предоставить соответствующие механизмы управления параллелизмом, чтобы гарантировать согласованность и целостность данных. Обычно это предполагает использование блокировок и других механизмов синхронизации для координации доступа между различными пользователями.
6. Восстановление и устранение неполадок
Чтобы предотвратить потерю данных, вызванную системными сбоями, системы баз данных обычно используют журналы (например, журналы повторного выполнения) для записи изменений данных. Таким образом, после сбоя системы данные можно восстановить до согласованного состояния путем повторного воспроизведения журнала. Грязные страницы в буферном пуле также будут перестроены в процессе восстановления.
Благодаря вышеуказанным принципам пул буферов играет ключевую роль в операциях добавления, удаления, изменения и запроса базы данных. Он значительно повышает производительность и масштабируемость базы данных с помощью таких стратегий, как кэширование и отложенная обратная запись.
Буферный пул MySQL — это высокооптимизированная область памяти, которая сокращает операции дискового ввода-вывода за счет кэширования данных и индексов горячих точек, что значительно повышает производительность базы данных. Проектирование и реализация пула буферов включает в себя множество сложных алгоритмов и структур данных, таких как алгоритм LRU, механизм упреждающего чтения и т. д. Понимание принципа работы и компонентов пула буферов имеет важное значение для оптимизации производительности MySQL и решения проблем с производительностью. С помощью изображений и текста мы можем более интуитивно понять основную роль пула буферов в операциях с данными.
Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт 『
код тридцать пять
』 , для получения дополнительной технической информации.