Как говорится, за каждым успешным мужчиной стоит женщина, которая молча за него платит, а для MySQL таким «человеком» является механизм хранения InnoDB.
Самой важной особенностью, которая отличает MySQL от других баз данных, является подключаемый механизм хранения таблиц. Среди многих механизмов хранения InnoDB является наиболее часто используемым механизмом хранения. Начиная с MySQL 5.5.8 механизм хранения InnoDB является механизмом хранения по умолчанию.
Механизм хранения InnoDB поддерживает транзакции, и его цель разработки в основном предназначена для приложений онлайн-обработки транзакций (OLTP). Его характеристиками являются схема блокировки строк, поддержка внешних ключей и поддержка чтения без блокировки, то есть операция чтения по умолчанию не создает блокировки.
InnoDB обеспечивает высокий уровень параллелизма за счет управления многоверсионным параллелизмом (MVCC) и реализует 4 уровня изоляции стандарта SQL, по умолчанию используется уровень REPEATABLE. В то же время используется стратегия, называемая блокировкой следующей клавиши, чтобы избежать фантомных чтений. Кроме того, механизм хранения InnoDB также обеспечивает высокую производительность и высокую доступность, такие как буфер вставки, двойная запись, адаптивный хэш-индекс и упреждающее чтение.
На приведенном выше рисунке подробно показана архитектура механизма хранения InnoDB.Как видно из рисунка, механизм хранения InnoDB состоит из трех частей: пула памяти, фоновых потоков и дисковых файлов. Далее давайте кратко разберемся с концепциями и принципами, связанными с памятью.буферный пул
Механизм хранения InnoDB основан на дисковом хранилище и управляет записями в нем в виде страниц. Но из-за разрыва между скоростью процессора и скоростью диска в системах баз данных на основе дисков часто используются записи пула буферов для повышения общей производительности базы данных.
Чтобы выполнить операцию чтения в базе данных, сначала поместите страницу, считанную с диска, в пул буферов, а в следующий раз, чтобы прочитать ту же страницу, сначала определите, находится ли страница в пуле буферов. Если она находится в буферном пуле, считается, что страница попала в буферный пул, и страница считывается напрямую. В противном случае прочитайте страницу на диске.
Для операций модификации страниц в базе данных сначала изменяются страницы в пуле буферов, а затем с определенной периодичностью сбрасываются на диск. Сброс страниц из пула буферов на диск не запускается каждый раз при обновлении страницы, а сбрасывается обратно на диск с помощью механизма, называемого CheckPoint.
Поэтому размер пула буферов напрямую влияет на общую производительность базы данных, которую можно задать параметром конфигурации innodb_buffer_pool_size.
В частности, типы страниц данных, кэшированных в пуле буферов, следующие: индексные страницы, страницы данных, страницы отмены, буферы вставки, адаптивные хэш-индексы, информация о блокировке, хранящаяся в InnoDB, и информация словаря данных.
Как видно из схемы архитектуры, в дополнение к пулу буферов, область памяти механизма хранения InnoDB также имеет буферы журналов повторов и дополнительные пулы памяти. Механизм хранения InnoDB сначала помещает информацию журнала повторов в этот буфер, а затем с определенной периодичностью сбрасывает ее в файл журнала повторов. Буфер журнала повторов обычно не нужно задавать очень большим, и этим значением можно управлять с помощью параметра конфигурации innodb_log_buffer_size.
страницы данных и индексные страницы
Страница — это основная структура хранилища Innodb и наименьшая единица управления дисками Innodb.Все содержимое, связанное с базой данных, хранится в структуре страницы. Страница делится на несколько типов, страницы данных и индексные страницы являются двумя наиболее важными типами.
Вставить буфер
Все мы знаем, что при вставке в движок InnoDB обычно необходимо вставлять в порядке первичного ключа, чтобы получить более высокую производительность вставки. При наличии в таблице некластеризованного и неуникального индекса при вставке сохранение страниц данных по-прежнему сохраняется в порядке первичного ключа, но вставка листовых узлов некластеризованного индекса уже не является последовательной. Требуется дискретный доступ к некластеризованным страницам индекса, что снижает производительность вставки из-за случайного чтения.
InnoDB разработала Insert Buffer для оптимизации вставки. Для операции вставки или обновления некластеризованного индекса он не вставляется каждый раз напрямую в страницу индекса, а сначала оценивается, находится ли вставленный некластеризованный индекс в пуле буферов, и если да, то вставляется напрямую; если нет, поместите его сначала в буфер вставки. Кажется, что некластеризованный индекс базы данных уже нашел конечный узел, но его нет, поэтому он хранится в другом месте. Затем выполните операцию слияния буфера вставки и дочерних узлов страницы некластеризованного индекса с определенной частотой и при определенных условиях. В настоящее время несколько вставок обычно можно объединить в одну операцию, что значительно повышает производительность вставки для некластеризованных индексов.
Двойная запись
Если Insert Buffer обеспечивает повышение производительности механизма хранения InnoDB, то Double Write обеспечивает механизму хранения InnoDB надежность страниц данных.
Как показано на рисунке выше, двойная запись состоит из двух частей: одна часть представляет собой буфер двойной записи в памяти размером 2 МБ, а другая часть представляет собой 128 последовательных страниц общего табличного пространства на физическом диске, а размер также 2MB. При сбросе грязных страниц буферного пула, вместо прямой записи на диск, грязные страницы сначала копируются в эту область в памяти через функцию memcpy, а затем делятся на два раза через буфер двойной записи, каждый раз 1МБ записываются последовательно на физический диск общего табличного пространства, а затем немедленно вызывают функцию fsync, чтобы синхронизировать диск и избежать проблем, вызванных буферизованной записью операционной системы. После завершения записи страницы doublewrite страницы буфера doublewire записываются в каждый файл табличного пространства.
Если операционная система дает сбой во время записи страницы на диск, во время восстановления механизм хранения InnoDB может найти копию страницы из doublewrite в общем табличном пространстве, скопировать ее в файл табличного пространства, а затем применить журналы повторов.
Буфер журнала повторов
Если версия страницы в пуле буферов новее, чем на диске, базе данных необходимо сбросить новую версию страницы из пула буферов на диск. Однако, если страница обновляется каждый раз, когда отправляется изменение, прирост производительности очень велик, поэтому InnoDB принимает стратегию опережающей записи журнала, то есть, когда транзакция фиксируется, сначала записывается журнал повторов, а затем грязный. страница записывается в выбранное время на диск. Если потеря данных происходит из-за простоя, восстановление данных выполняется через журналы повторов.
Механизм хранения InnoDB сначала помещает информацию журнала повторов в буфер журнала повторов, а затем с определенной периодичностью сбрасывает ее в файл журнала повторов. Буфер журнала повторов обычно не нужно задавать очень большим, потому что буфер журнала повторов обычно сбрасывается в файл журнала каждую секунду. Его можно контролировать с помощью параметра конфигурации innodb_log_buffer_size, значение по умолчанию — 8 МБ.
В дополнение к механизму очистки каждую секунду буфер журнала повторов также сбрасывается в журнал каждый раз, когда фиксируется транзакция. InnoDB — это механизм хранения транзакции, реализующий персистентность транзакции через механизм Force Log at Commit, то есть, когда транзакция фиксируется, все журналы транзакции должны быть записаны в файл журнала повторов для персистентности, а затем операция фиксации транзакции Done завершена. Механизм записи InnoDB примерно такой, как показано на рисунке ниже.
Чтобы обеспечить запись каждого журнала в файл журнала повторов, после записи каждого буфера журнала повторов в журнал повторов необходимо вызвать операцию fsync для фактической записи файла буфера из кэша файловой системы на диск.
Вы можете управлять журналом реформ, чтобы он обновлялся на диск с помощью политики. Значение этого параметра по умолчанию равно 1, что указывает на то, что отправка транзакции должна быть операцией fsync, а также может быть установлено на 0, а 2.0 указывает, что транзакция не записывается, а выполняется только в основном потоке, 2 указывает, что запись в журнал, но записывается только в кеш файловой системы, а не в операцию FSYNC. Видно, что при значении 0 производительность самая высокая, но целостность транзакции теряется.
Адаптивный хэш-индекс
InnoDB будет строить хэш-индексы для горячих страниц в соответствии с частотой и шаблоном доступа, чтобы повысить эффективность запросов. Механизм хранения InnoDB будет отслеживать запрос каждой страницы индекса в таблице.Если будет установлено, что создание хэш-индекса может привести к повышению скорости, будет установлен хэш-индекс, поэтому он называется адаптивным хэш-индексом.
Адаптивный хеш-индекс строится из страниц дерева B+ пула буферов, поэтому скорость создания очень высока, и нет необходимости устанавливать хэш-индекс для всей таблицы данных. У него есть требование, чтобы режим непрерывного доступа к этой странице был одинаковым, то есть его условия запроса (ГДЕ) должны быть точно такими же и должны быть непрерывными.
Информация о блокировке (информация о блокировке)
Все мы знаем, что механизм хранения InnoDB блокирует табличные данные на уровне строк. Однако InnoDB также использует блокировки во многих других местах базы данных, обеспечивая одновременный доступ ко многим различным ресурсам. Системы баз данных используют блокировки для поддержки одновременного доступа к общим ресурсам и обеспечения целостности и согласованности данных. Мы узнаем больше о конкретных знаниях о замках позже.
Информация словаря данных (словарь данных)
InnoDB имеет собственный кеш таблиц, который можно назвать кешем определения таблицы или словарем данных. Когда InnoDB открывает таблицу, она добавляет соответствующий объект в словарь данных.
Словарь данных — это набор метаинформации о данных, библиотечных объектах, табличных объектах и т. д. в базе данных. В MySQL содержимое информации словаря данных включает в себя структуру таблицы, имя базы данных или имя таблицы, тип данных поля, представление, индекс, информацию о поле таблицы, хранимую процедуру, триггер и т. д. Библиотека MySQL INFORMATION_SCHEMA предоставляет метаданные, статистическую информацию и информацию о доступе к серверу MySQL (например: имя базы данных или имя таблицы, тип данных поля и права доступа и т. д.). Информация, хранящаяся в этой библиотеке, также может называться словарем данных MySQL.
постскриптум
Эта статья является лишь кратким введением в концепции и принципы памяти InnoDB.Если вы хотите узнать больше об InnoDB, обратите внимание на мой общедоступный аккаунт WeChat.
Ссылаться на
- «Инсайдер технологии MySQL InnoDB Storage Engine»
- «Высокопроизводительный MySQL»
- Схема архитектуры InnoDB Цзяна Чэнсяо