инфраструктура MySQL
Диаграмма базовой архитектуры MySQL
В целом,MySQL
Его можно разделитьServer
Слой и механизм хранения состоят из двух частей.
-
Server
Уровни включают коннекторы, кэши запросов, анализаторы, оптимизаторы, исполнители и т. д., охватывающиеMySQL
На этом уровне реализованы большинство основных сервисных функций , а также все встроенные функции (такие как дата, время, математические функции и функции шифрования и т. д.), все функции кросс-хранилища, такие как хранимые процедуры, триггеры. , просмотры и т.д.-
Соединитель
Соединитель — это то, что вы используете при подключении к базе данных, и он отвечает за установление соединения с клиентом, получение разрешений, поддержку и управление соединением.
Заказ:mysql -h$ip -P$port -u$user -p
, введите пароль после нажатия Enter, либо введите пароль после -p, но есть риск утечки пароля.show processlist
, Вы можете просмотреть состояние соединения.В колонке Command стоит Sleep, указывающий на то, что соединение находится в режиме ожидания.
Бездействующие соединения будут отключены по умолчанию на 8 часов, что можно настроить параметром wait_timeout.В базе данных длинное соединение означает, что после успешного соединения, если клиент продолжает получать запросы, всегда будет использоваться одно и то же соединение. Короткое соединение означает, что соединение разрывается каждый раз, когда выполняется несколько запросов, а новое соединение восстанавливается для следующего запроса.
Поскольку установление соединения потребляет ресурсы, рекомендуется максимально использовать длинное соединение.Однако после использования длинного соединения память, занимаемая MySQL, увеличивается очень быстро.Это связано с тем, что память, временно используемая MySQL в процессе выполнения управляется в объекте соединения. Эти ресурсы будут освобождены только при отключении соединения. Таким образом, если накапливаются длинные соединения, это может привести к чрезмерному использованию памяти и принудительному уничтожению системой (OOM).Из-за этого MySQL перезапускается ненормально.
решение:
- Периодически отключайте длинные соединения. После его использования в течение определенного периода времени или после того, как будет установлено, что в программе был выполнен большой запрос, занимающий память, соединение разрывается, а затем необходимо повторно подключить запрос.
- Если вы используете MySQL 5.7 или новее, вы можете выполнить более крупную операцию, выполнив
mysql_reset_connection
для повторной инициализации ресурса подключения. Этот процесс не требует повторного подключения и повторной аутентификации, но восстанавливает соединение до состояния, в котором оно было только что создано.
-
кэш запросов
Кэширование запросов — это способ хранения ранее выполненных операторов и их результатов вkey-value
Форма пары кэшируется в памяти. Ключ — это оператор запроса, а значение — результат запроса. Если ваш запрос может найти ключ непосредственно в этом кеше, то значение будет возвращено непосредственно клиенту. Кэш запросов был удален в MYSQL8, а количество попаданий было низким из-за частого аннулирования кеша запросов. -
Анализатор
Анализатор сначала проведет «лексический анализ», чтобы определить, что представляют собой строки внутри и что они представляют. Затем вам нужно выполнить «синтаксический анализ», чтобы определить, удовлетворяет ли введенный вами оператор SQL синтаксису MySQL. -
оптимизатор
-
Актуатор
-
-
Уровень механизма хранения отвечает за хранение и извлечение данных. Его архитектурный шаблон подключаемый и поддерживает
InnoDB、MyISAM、Memory
и другие механизмы хранения. На сегодняшний день наиболее часто используемым механизмом хранения являетсяInnoDB
, начинается сMySQL 5.5.5
Версия стала механизмом хранения по умолчанию.
одинSelect
Поток выполнения инструкции
На приведенном выше рисунке в качестве примера используется механизм хранения InnoDB Процесс обработки выглядит следующим образом:
-
Пользователь отправляет запрос на
tomcat
,пройти черезtomcat
пул ссылок иmysql
Пул соединений устанавливает соединение, а затем отправляет операторы SQL через соединение вMySQL
; -
MySQL
Существует отдельный поток прослушивания, который считывает данные запроса и получает оператор SQL, запрошенный в соединении; -
Отправить полученные данные SQL в интерфейс SQL для выполнения;
-
Интерфейс SQL отправляет SQL парсеру SQL для разбора;
-
Отправьте проанализированный SQL оптимизатору запросов, найдите оптимальный путь запроса и отправьте его исполнителю;
-
Исполнитель вызывает интерфейс механизма хранения в соответствии с оптимизированным планом выполнения для выполнения в определенном порядке и шагах.
Например, например, исполнитель может сначала вызвать интерфейс механизма хранения для получения первой строки данных в таблице «users», а затем определить, равно ли значение поля «id» этих данных значение, которое мы ожидаем, Если нет, то продолжаем вызывать интерфейс механизма хранения, чтобы получить следующую строку данных в таблице «users». Основываясь на вышеизложенных идеях, исполнитель будет переходить к набору планов выполнения, сгенерированных нашим оптимизатором, а затем постоянно вызывать различные интерфейсы механизма хранения для выполнения плана выполнения оператора SQL, который примерно постоянно обновляет или извлекает какие-то данные. вне.
Здесь возникает несколько вопросов:
-
Что такое драйвер MySQL? Взяв в качестве примера java, если мы хотим получить доступ к базе данных MySQL в системе Java, мы должны добавить драйвер MySQL к системным зависимостям, таким как Maven.
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency>
Так что же это за драйвер MySQL?На самом деле драйвер L устанавливает сетевое соединение с базой данных на нижнем уровне.При сетевом соединении он может отправлять запросы на сервер базы данных! Позвольте системе, написанной на языке, получить доступ к базе данных через драйвер MySQL, как показано ниже.
-
Для чего используется пул соединений с базой данных?
Предполагая, что веб-служба разработана на java и развернута на tomcat, tomcat может обрабатывать запросы одновременно с несколькими потоками, поэтому первый момент заключается в том, что невозможно создать только одно соединение с базой данных (несколько запросов для захвата соединения, что очень неэффективно). ).
Во-вторых, что, если каждый запрос создает соединение с базой данных? Это тоже очень плохо, потому что каждый раз требуется время для установления соединения с базой данных. часто вызывает проблемы с производительностью.
Поэтому обычно используется пул соединений с базой данных, то есть в пуле поддерживается несколько соединений с базой данных, а несколько потоков используют в нем разные соединения с базой данных для выполнения операторов SQL.После выполнения операторов SQL не разрушайте соединение с базой данных, а Поместите соединение обратно в пул, и вы сможете продолжить использовать его позже. На основе такого механизма пула соединений с базой данных может быть решена проблема одновременного использования несколькими потоками нескольких соединений с базой данных для выполнения операторов SQL, а также можно избежать проблемы разрушения соединений с базой данных после использования.
-
Для чего используется пул соединений базы данных MySQL?
Функция пула соединений базы данных MySQL такая же, как у пула соединений на стороне приложения Java, и он играет роль мультиплексирования соединений.
InnoDB
механизм хранения
InnoDB
Анализ архитектуры
Как видно из рисунка,InnoDB
механизм храненияпул памяти,фоновая нитьифайл на дискесостоит из трех частей
Вот еще одна картинка, которая выделяет ключевые моменты:
Но приведенные выше картинки слишком сложно запомнить, вот краткая картинка:
InnoDB
Механизм хранения, часть 1: структура памяти
Buffer Pool
буферный пул
InnoDB
Механизм хранения основан на дисковом хранилище и управляет записями в нем как страницами, но из-за разрыва между скоростью ЦП и скоростью диска дисковые системы баз данных обычно используют записи пула буферов для повышения общей производительности базы данных.
Когда база данных выполняет операцию чтения, страница, считанная с диска, помещается в пул буферов.Когда та же самая страница читается в следующий раз, сначала оценивается, находится ли страница в пуле буферов. Если она находится в буферном пуле, говорят, что страница попала в буферный пул, и страница читается напрямую, в противном случае читается страница на диске.
Для операций модификации страниц в базе данных сначала изменяются страницы в пуле буферов, а затем с определенной периодичностью сбрасываются на диск.Сброс страниц из пула буферов на диск не запускается каждый раз при обновлении страницы, но черезCheckPoint
механизм для сброса обратно на диск. Поэтому размер пула буферов напрямую влияет на общую производительность базы данных, которую можно настроить, настроив параметрыinnodb_buffer_pool_size
Чтобы установить, буферный пул по умолчанию составляет 128 МБ, что все еще немного мало.Если ваша база данных представляет собой 16-ядерную машину 32G, вы можете указатьBuffer Pool
Выделите 2 ГБ памяти.
Поскольку пул буферов не бесконечен, поскольку страницы данных на диске постоянно загружаются в пул буферов, пул буферов всегда будет использоваться. В это время можно удалить только некоторые страницы кэша. Метод исключения использует наименьший Недавно Используйте алгоритм (LRU), специально для введения нового связанного списка LRU, с помощью этого связанного списка LRU вы можете узнать, какие страницы кеша использовались наименее недавно, а затем, когда вам нужно освободить страницу кеша, чтобы сбросить на диск , Для вытеснения можно выбрать наименее использовавшуюся страницу кэша в этом списке LRU.
Типы страниц данных, кэшированных в пуле буферов:Страница индекса, страница данных, страница отмены, буфер вставки, адаптивный хэш-индекс, информация о блокировке и информация словаря данных, хранящаяся в InnoDB..
страницы данных и индексные страницы
Страница(Page
)ДаInnodb
Самая основная структура хранилища такжеInnodb
Наименьшая единица управления дисками, все, что связано с базой данных, хранится вPage
в структуре.Page
Разделенные на несколько типов, страницы данных и индексные страницы являются двумя наиболее важными типами.
Вставить буфер (Insert Buffer
)
существуетInnoDB
При вставке в движок обычно необходимо вставлять в порядке первичного ключа, чтобы получить более высокую производительность вставки. Когда в таблице присутствует некластеризованный неуникальный индекс, при вставке страницы данных сохраняются в порядке первичного ключа, но вставка листовых узлов некластеризованного индекса уже не является последовательной, то необходимо Дискретный доступ к некластеризованным страницам индекса приводит к низкой производительности вставки из-за случайного чтения.
такInnoDB
Механизм хранения имеет революционную конструкциюInsert Buffer
, для операции вставки или обновления некластеризованного индекса он не вставляется каждый раз напрямую в страницу индекса, а сначала оценивает, находится ли вставленная некластеризованная страница индекса в буферном пуле, если да, то вставляет ее напрямую; если нет, поместите его сначала вInsert Buffer
возразить, как бы обмануть. Некластеризованный индекс базы данных был вставлен в конечный узел, но фактически не хранится в другом месте. Затем при определенной частоте и ситуацииInsert Buffer
Операции слияния с подузлами вторичных страниц индекса, где несколько вставок обычно можно объединить в одну операцию (потому что в одной странице индекса), что значительно повышает производительность вставок для некластеризованных индексов.
тем не мениеInsert Buffer
Для использования необходимо одновременное выполнение следующих двух условий:
- Индекс является вторичным индексом (secondary index);
- Индексы не уникальны.
При соблюдении двух вышеуказанных условийInnoDB
Механизм хранения будет использоватьInsert Buffer
, что повышает производительность операций вставки. Но рассмотрим такую ситуацию: приложение выполняет большое количество операций вставки, в которых задействованы неуникальные некластеризованные индексы, то есть используютInsert Buffer
. Если база данных MySQL не работает в это время, будет большое количествоInsert Buffer
Не объединены с фактическим некластеризованным индексом.
Поэтому восстановление может занять много времени, в крайних случаях даже несколько часов. Вспомогательные индексы не могут быть уникальными, потому что база данных не просматривает страницу индекса, чтобы определить уникальность вставленной записи при вставке в буфер. Если пойти искать, то обязательно будут дискретные чтения, которые приведут кInsert Buffer
потерял смысл.
по командеSHOW ENGINE INNODB STATUS
для просмотра информации о буфере вставки
seg size показывает, что размер текущего буфера вставки составляет 11336×16 КБ, что составляет около 177 МБ; len списка свободных мест представляет длину списка свободных мест; size представляет количество страниц объединенных записей. И строка 2, выделенная жирным шрифтом, вероятно, действительно волнует пользователей, так как она показывает увеличение производительности вставки. Inserts представляет количество вставленных записей; merged recs представляет количество объединенных вставленных записей; merges представляет количество слияний, то есть количество фактически прочитанных страниц. слияния: объединенные записи составляют примерно 1:3, что означает, что буферы вставки сокращают дискретные логические запросы ввода-вывода для некластеризованных индексных страниц примерно на 2/3.
Как было сказано ранее, на данный момент существует проблема с Insert Buffer: в случае интенсивной записи буфер вставки будет занимать слишком много памяти буферного пула (innodb buffer pool), а по умолчанию максимум может занимать 1/2 памяти буферного пула . Ниже приведена операция инициализации буфера вставки в исходном коде механизма хранения InnoDB:
Change Buffer
InnoDB
Введено с версии 1.0.xChange Buffer
, что можно рассматривать какInsert Buffer
обновленная версия,InnodB
Механизм хранения может работать на DML —INSERT
,DELETE
,UPDATE
буферизуются, они:Insert Buffer
,Delete Buffer
,Purge buffer
конечно и раньшеInsert Buffer
Такой же,Change Buffer
Применимые объекты по-прежнему не являются уникальными вторичными индексами.
на записиUPDATE
Операцию можно разделить на два процесса:
- пометить запись как удаленную;
- на самом деле удалить запись
следовательноDelete Buffer
соответствоватьUPDATE
Первая часть операции заключается в том, чтобы пометить запись для удаления.PurgeBuffer
соответствоватьUPDATE
Второй процесс операции касается записи фактического удаления. в то же время,InnoDB
Механизм хранения предоставляет параметрыinnodb_change_buffering
, используется для открытия различных параметров буфера. Необязательные значения для этого параметра:Inserts
,deletes
,purges
,changes
,all
,none
.Inserts
,deletes
,purges
Это три случая, рассмотренные выше.changes
Указывает, что включеноInserts
иdeletes
,all означает включить все, none означает ничего. Значение этого параметра по умолчанию — все.
Начиная с версии InnoDB1.2.x, вы можете передать параметрinnodb_change_buffer_max_size
контролироватьChange Buffer
Максимальный объем используемой памяти:
mysql> show variables like 'innodb_change_buffer_max_size';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| innodb_change_buffer_max_size | 25 |
+-------------------------------+-------+
1 row in set (0.05 sec)
innodb_change_buffer_max_size
Значение по умолчанию равно 25, что означает, что используется не более 1/4 объема памяти буферного пула.
Следует отметить, что максимально допустимое значение этого параметра равно 50 в MySQL 5.5 через командуSHOW ENGINE INNODB STATUS
, вы можете наблюдать что-то похожее на следующее:
Вы можете увидеть, как это отображается здесьmerged operations
иdiscarded operation
, и следующий конкретный дисплейChange Buffer
Количество раз для каждой операции в .Insert
выражатьInsert Buffer
; delete mark
выражатьDelete Buffer
; delete
выражатьPurge Buffer
; discarded operations
означает, когдаChange Buffer
происходитьmerge
Когда таблица удалена, нет необходимости объединять записи во вторичный индекс.
Адаптивный хэш-индекс
InnoDB
В соответствии с частотой и режимом доступа для горячих страниц будет создан хэш-индекс для повышения эффективности запросов.InnoDB
Механизм хранения будет отслеживать запрос каждой страницы индекса в таблице.Если будет установлено, что создание хэш-индекса может привести к повышению скорости, будет создан хэш-индекс, поэтому он называется адаптивным хэш-индексом.
Адаптивный хэш-индекс строится из страниц дерева B+ пула буферов, поэтому скорость установления очень высока, и нет необходимости устанавливать хэш-индекс для всей таблицы данных. У него есть требование, чтобы режим непрерывного доступа к этой странице был одинаковым, то есть условия запроса должны быть точно такими же и должны быть непрерывными.
информация о блокировке (lock info
)
мы все знаем,InnoDB
Механизм хранения блокирует данные таблицы на уровне строки, ноInnoDB
Откройте таблицу, добавьте соответствующий объект в словарь данных.
Словарь данных
Набор метаинформации о данных в базе данных, библиотечных объектах, табличных объектах и т. д. В MySQL содержимое информации словаря данных включает в себя структуру таблицы, имя базы данных или имя таблицы, тип данных поля, представление, индекс, информацию о поле таблицы, хранимую процедуру, триггер и т. д.INFORMATION_SCHEMA
Библиотека предоставляет метаданные, статистику и информацию о доступе к серверу MySQL (например: имя базы данных или таблицы, тип данных поля и права доступа и т. д.). Информация, хранящаяся в этой библиотеке, также может называться словарем данных MySQL.
механизм опережающего чтения
Механизм упреждающего чтения MySQL заключается в том, что когда вы загружаете страницу данных с диска, он также может загружать в кэш другие страницы данных, смежные с этой страницей данных!
Например, предположим, что сейчас есть две свободные страницы кеша, а затем при загрузке страницы данных он также загружает в кеш одну из соседних страниц данных, просто помещает каждую страницу данных в свободную страницу кеша.
При каких обстоятельствах сработает механизм упреждающего чтения MySQL?
-
Одним из параметров является innodb_read_ahead_threshold, и его значение по умолчанию равно 56, что означает, что если доступ к нескольким страницам данных в области осуществляется последовательно, и количество страниц данных, к которым осуществляется доступ, превышает этот порог, будет запущен механизм упреждающего чтения, и сработает механизм forward, в кэш загружаются все страницы данных в следующем смежном экстенте.
-
Если 13 последовательных страниц данных в области кэшируются в буферном пуле и к этим страницам данных часто обращаются, механизм предварительного чтения будет запущен напрямую, и все остальные страницы данных в этой области будут автоматически загружаться в кэш. управляется параметром innodb_random_read_ahead, который по умолчанию выключен, то есть это правило выключено.
Таким образом, по умолчанию в основном первое правило может запускать механизм упреждающего чтения, который загружает страницы данных во многих смежных областях в кеш одновременно.
Преимущество механизма упреждающего чтения заключается в повышении производительности. Предположим, вы прочитали страницу данных 01 в кэш-страницу, тогда можно последовательно прочитать в кэш-страницу страницу данных 02, примыкающую к странице данных 01. В это время возможно ли прочитать страницу данных? снова инициировать дисковый ввод-вывод в 02?
Поэтому, чтобы оптимизировать производительность, MySQL разработал механизм упреждающего чтения, который означает, что если вы находитесь в какой-либо области, вы последовательно прочитали много страниц данных, например, страницы данных с 01 по 56 были прочитаны последовательно. MySQL будет судить, вы можете продолжить последовательное чтение следующих страниц данных. Затем в это время большое количество последующих страниц данных (таких как страница данных 57 до страницы данных 72) заранее считываются в пул буферов.
Управление памятью буферного пула
Здесь нужно понимать три связанных списка (Free List
,Flush List
,LRU List
),
-
Free List
Страницы данных и страницы кэша на диске находятся во взаимно однозначном соответствии, обе по 16 КБ, и одна страница данных соответствует одной странице кэша. База данных будетBuffer Pool
дизайн одинfree
Связный список, он представляет собой структуру данных двусвязного списка, этоfree
В связанном списке каждый узел является адресом блока данных описания свободной страницы кеша, то есть, пока одна из ваших страниц кеша свободна, его блок данных описания будет помещен в этотfree
в связанном списке. Когда база данных запускается впервые, все страницы кэша могут быть свободны, потому что в это время это может быть пустая база данных без данных, поэтому блоки данных описания всех страниц кэша в это время будут помещены в этот блок.free
связанный список, среди прочего, этоfree
Связанный список имеет базовый узел, который ссылается на головной узел и хвостовой узел связанного списка, а также хранит количество узлов в связанном списке, описывающих блок данных, то есть сколько свободных страниц кэша имеется. -
Flush List
иFree List
Подобно связанному списку,flush
Суть связанного списка заключается в использовании двух указателей в блоке данных описания страницы кэша, чтобы сделать блок данных описания модифицированной страницы кэша двусвязным списком. Для любой кешированной страницы, которая была изменена, ее блок данных описания будет добавлен вflush
к связанному списку,flush
Это означает, что это грязные страницы, и продолжение должноflush
слить на диск. -
LRU List
Поскольку размер буферного пула фиксирован, другими словамиfree
Данные свободной страницы кеша в связанном списке определены.Когда вы продолжаете загружать страницы данных на диске в свободные страницы кеша,free
Свободные страницы кеша постоянно удаляются из связанного списка, и рано или поздно наступит момент,free
В связанном списке нет свободных страниц кеша. В настоящее время необходимо удалить некоторые страницы кеша. Кого следует удалить? Это требует использования частоты попаданий в кеш. Обычно используются те, у которых больше попаданий в кеш, а те, которые обычно не используются, могут быть исключены. Так что импортLRU
Связанный список используется для определения того, какие кэшированные страницы обычно не используются.Какова стратегия ликвидации связанного списка LRU?
Предположим, что когда мы загружаем страницу данных с диска на страницу кеша, мы помещаем блок данных описания страницы кеша в заголовок связанного списка LRU, тогда пока есть страница кеша с данными, она будет находиться в LRU и загружен недавно. Кэшированные страницы данных будут помещены в начало связанного списка LRU, а затем кешированная страница будет добавлена в хвост. Пока происходит запрос, он будет перемещен в голову , а затем последний хвост нужно удалить.Но действительно ли это возможно?
-
В первом случае нарушается механизм предварительного чтения.
Поскольку механизм упреждающего чтения загружает в кеш соседние страницы данных, к которым еще не было доступа, фактически осуществляется доступ только к одной странице кеша, а к другой странице кеша, загруженной с помощью механизма упреждающего чтения, фактически никто не обращается. страницы кэша могут находиться перед списком LRU, как показано нижеВ это время, если свободной страницы кэша нет, то в это время необходимо загрузить новую страницу данных.Необходимо ли вынимать из конца связанного списка LRU так называемую "наименее использовавшуюся страницу кэша" и сбросить на диск?Тогда освободите свободную страницу кеша. Это, очевидно, очень неразумно. -
Второй сценарий может привести к удалению часто используемых страниц кэша.
Полное сканирование таблицы заставило его напрямую загрузить все страницы данных в таблице с диска в буферный пул. В это время все страницы данных этой таблицы могут быть загружены в каждую страницу кэша одна за другой! В настоящее время большая серия страниц кеша в начале связанного списка LRU может оказаться всеми страницами кеша, загруженными при полном сканировании таблицы! Так что, если данные в этой таблице практически не используются после полного сканирования таблицы? В это время хвост списка LRU может быть теми страницами кэша, к которым раньше часто обращались! Затем, когда вы захотите удалить некоторые страницы кэша, чтобы освободить место, страницы кэша, к которым часто обращались в конце связанного списка LRU, будут удалены, оставив большое количество редко используемых страниц кэша, загруженных предыдущим полным сканированием таблицы. Кэшировать страницы!
Оптимизированный алгоритм LRU: Дизайн связанного списка LRU основан на идее разделения горячих и холодных данных.
Когда MySQL разработала связанный список LRU, она фактически приняла идею разделения горячих и холодных данных. Связанный список LRU будет разделен на две части: одна — «горячие» данные, а другая — «холодные» Соотношение «горячих» и «холодных» данных определяетсяinnodb_old_blocks_pct
Для управления параметрами он по умолчанию равен 37, значит, на холодные данные приходится 37%. Когда страница данных впервые загружается в кэш, кэшированная страница фактически помещается в начало связанного списка в области холодных данных.Затем MySQL установил правило, он разработал
innodb_old_blocks_time
Параметр, значение по умолчанию 1000, что составляет 1000 миллисекунд.То есть он должен быть после загрузки страницы данных в страницу кеша.Через 1с, когда вы обращаетесь к странице кеша, она будет перемещена в начало связанный список в области горячих данных. Потому что, если вы загружаете страницу данных в кеш, а затем получаете доступ к странице кеша через 1 с, это означает, что вы, вероятно, будете часто обращаться к ней в будущем.Ограничение по времени составляет 1 с, поэтому вы получаете доступ к этой странице только через 1 с. Кэшированные страницы, он передаст вам кешированные страницы в начало связанного списка в области горячих данных.
В этом случае данные предварительного чтения и полного сканирования таблицы будут находиться только в заголовке холодных данных, а не попадут в область горячих данных в начале.Экстремальная оптимизация алгоритма LRU
Оптимизировать правила доступа к области горячих данных связанного списка LRU, то есть только при доступе к страницам кэша в последних 3/4 области горячих данных они будут перемещены в начало связанного списка . Если вы обращаетесь к первой 1/4 страницы кэша в области горячих данных, она не переместится в начало связанного списка.Например, если предположить, что в связанном списке области оперативных данных имеется 100 страниц кэша, первые 25 страниц кэша не будут перемещены в начало связанного списка, даже если к ним будут обращаться. Но для следующих 75 страниц кеша, пока к ним обращаются, они будут перемещены в начало связанного списка. Таким образом, он может максимально сократить перемещение узла в связанном списке.
Связанный список LRU для устранения времени кэширования страниц
MySQL
в исполненииCRUD
Во-первых, это большое количество страниц кэша операций и несколько связанных с ними списков. Затем, когда страницы кеша заполнены, вы должны найти способ сбросить некоторые страницы кеша на диск, затем очистить эти страницы кеша, а затем загрузить необходимые страницы данных в страницы кеша!Мы уже знаем, что он удаляет страницы кеша согласно связанному списку LRU, так когда именно он сбрасывал на диск страницы кеша в области холодных данных связанного списка LRU? На самом деле у него есть следующие три возможности:
- Периодически сбрасывать некоторые кешированные страницы в конце LRU на диск.
Фоновый поток запускает запланированное задание.Это запланированное задание будет через равные промежутки времени сбрасывать на диск некоторые страницы кеша в конце области холодных данных связанного списка LRU, очищать эти страницы кеша и добавлять их обратно на диск. .free
перейти к связанному списку.
-
Пучок
flush
Некоторые страницы кеша в связанном списке периодически сбрасываются на диск.
Недостаточно просто сбросить на диск страницы кеша области холодных данных связанного списка LRU, потому что многие страницы кеша в области горячих данных связанного списка также могут часто изменяться. слил на диск?
Таким образом, этот фоновый поток также будетMySQL
Когда не очень занят, ставьflush
Все страницы кэша в связанном списке сбрасываются на диск, поэтому измененные вами данные рано или поздно будут сброшены на диск!
если толькоflush
Волна страниц кеша в связанном списке сбрасывается на диск, затем эти страницы кеша также будутflush
связанный список иlru
Удалено из связанного списка, затем добавлено вfree
Перейти к списку!Таким образом, общий эффект заключается в том, чтобы продолжать загружать данные в кэшированную страницу, постоянно запрашивая и изменяя кэшированные данные, а затем
free
Кэшированные страницы в связанном списке продолжают уменьшаться,flush
Кэшированные страницы в связанном списке продолжают увеличиваться,lru
Кэшированные страницы в связанном списке постоянно увеличиваются и перемещаются.
С другой стороны, ваш фоновый поток продолжает помещатьlru
кэшированные страницы области холодных данных связанного списка иflush
Страница кеша связанного списка сбрасывается на диск, чтобы очистить страницу кеша, а затемflush
связанный список иlru
Количество кэшированных страниц в связанном списке уменьшается,free
Кэшированные страницы в связанном списке увеличиваются. -
free
В связанном списке нет свободных страниц кеша
я упалfree
Был использован связанный список.В настоящее время, если вы хотите загрузить страницу данных с диска на свободную страницу кеша, страница кеша будет найдена в конце области холодных данных связанного списка LRU.Это должна быть наименее часто используемой страницей кэша. ! Затем сбросьте его на диск и сбросьте, затем загрузите страницу данных в эту бесплатную страницу кэша!
-
Подводя итог, использование трех связанных списков,Buffer Pool
При использовании он будет часто загружать страницы данных с диска в свои кэш-страницы, а затемfree
связанный список,flush
связанный список,lru
Связанный список будет использоваться одновременно, например, при загрузке данных на страницу кеша,free
Кэшированная страница будет удалена из связанного списка, а затемlru
Заголовок области холодных данных связанного списка размещается на этой странице кеша.
Затем, если вы измените кешированную страницу, тоflush
Эта грязная страница будет записана в связанный список,lru
Связанный список также может переместить вас из области холодных данных в начало области горячих данных.
Если вы запрашиваете кешированную страницу, то кешированная страница будет сохранена вlru
Связанный список перемещается в область горячих данных, или он также может быть перемещен в начало в области горячих данных.
Redo log Buffer
буферизация журнала повторов
InnoDB
имеютbuffer pool
(сокращенно бп). bp - это кеш страниц базы данных, правильноInnoDB
Любая операция модификации bp сначала будетpage
on, то такие страницы будут отмечены какdirty
(грязные страницы) и помещаются в специальныйflush list
, продолжение будетmaster thread
Или выделенный грязный поток периодически записывает эти страницы на диск (disk or ssd
).
Преимущество этого заключается в том, чтобы избежать большого количества случайных операций ввода-вывода, вызванных работой диска для каждой операции записи, а периодическое загрязнение может многократно изменять страницу.merge
в операцию ввода-вывода, а асинхронная запись также снижает задержку доступа. Однако, если вdirty page
Перед прошивкой на дискserver
В случае нештатного завершения работы эти операции модификации будут потеряны, а если выполняются операции записи, база данных может быть даже недоступна из-за поврежденных файлов данных.
Во избежание вышеуказанных проблем,Innodb
Записывайте все операции модификации страниц в специальный файл и восстанавливайте операции из этого файла при старте базы данных.redo log file
. Такая технология задерживает обновление страницы bp, тем самым повышая пропускную способность базы данных и эффективно сокращая задержку доступа.
Проблема в том, что лишняя записьredo log
Накладные расходы на операцию (последовательный ввод-вывод, который, конечно, быстрый) и время, необходимое для возобновления операции при запуске базы данных.
redo
Журнал состоит из двух частей:redo log buffer
,redo log file
(Представлено в разделе о дисковых файлах).innodb
Это механизм хранения, который поддерживает транзакции.Когда транзакция зафиксирована, все журналы транзакции должны быть записаны вredo
В файле журнала ожидающие транзакцииcommit
Вся операция транзакции завершается, когда операция завершена. каждый раз, когдаredo log buffer
написатьredo log file
После этого нужно позвонить один разfsync
операция, потому что буферизация журнала повторов сначала записывает содержимое только в буферную систему операционной системы и не гарантирует, что оно будет записано непосредственно на диск, поэтому это необходимо сделать один раз.fsync
работать. Таким образом, производительность диска также в определенной степени определяет производительность отправки транзакций (особенно позже).redo log
Знакомство с механизмом падения).
InnoDB
Механизм хранения сначала помещает информацию журнала повторов в буфер журнала повторов, а затем с определенной периодичностью сбрасывает ее в файл журнала повторов. часы будут сбрасывать буфер журнала повторов в файл журнала, который можно настроить с помощью параметровInnodb_log_buffer_size
Управление, по умолчанию 8 МБ.
Double Write
двойная запись
если мы предположимInsert Buffer
даватьInnoDB
Механизм хранения обеспечивает повышение производительности, а затемDouble wtite
приноситьInnoDB
Механизм хранения — надежность страниц данных.
InnoDB
изPage Size
Он вообще 16кб, и его проверка данных тоже рассчитана на эти 16кб.Запись данных на диск основана наPage
работать на единицу. Мы знаем, что, поскольку файловая система не является атомарной операцией для большой страницы данных (например, 16 КБ InnoDB), в большинстве случаев это означает, что в случае сбоя сервера может быть выполнена только часть записи. 16K данных, при записи 4K система выключаетсяos crash
, только часть записи успешна, в данном случае этоpartial page write
проблема.
Опытный администратор базы данных может подумать, что если произойдет сбой записи, MySQL можетredo log
восстановить. Это подход, но следует четко осознавать, чтоredo log
То, что записывается, является физической модификацией страницы, такой как смещение 800, запись записи «аааа». Если повреждена сама страница, переделывать нет смысла. MySQL проверяет во время восстановленияpage
изchecksum
,checksum
просто проверьтеpage
Номер последней транзакции , произошлоpartial page write
проблема,page
сломался, не могу найтиpage
Номер транзакции в . С точки зрения InnoDB, такие страницы данных не могут проходить черезchecksum
После проверки его невозможно восстановить. Даже если мы заставим его пройти проверку, он не сможет восстановиться после сбоя, потому что некоторые типы журналов, которые в настоящее время существуют в InnoDB, являются логическими операциями и не могут быть идемпотентными.
Чтобы решить эту проблему, InnoDB реализуетdouble write buffer
Проще говоря, это запись страницы данных в независимое физическое расположение файла (ibdata) перед записью страницы данных, а затем запись на страницу данных. Таким образом, во время выключения и перезапуска, если страница данных повреждена, приложениеredo log
Раньше страницу нужно было восстанавливать из копии страницы, а потомredo log
переделать, этоdouble write
.double write
технология приноситinnodb
Механизм хранения - это надежность страницы данных, следующее лицоdoublewrite
Анализ технологии
Как показано на фиг.Double Write
Состоит из двух частей, одна часть в памятиdouble write buffer
, размер 2 МБ, а другая часть — 128 последовательных страниц общего табличного пространства на физическом диске, и размер тоже 2 МБ. При сбросе грязных страниц буферного пула пишет не напрямую на диск, а черезmemcpy
Функция сначала копирует грязные страницы в эту область памяти, а затем передаетdouble write buffer
Делится на два раза, каждый 1Мб последовательно записывается на физический диск общего табличного пространства, а потом вызывается сразуfsync
для синхронизации диска и предотвращения проблем, вызванных буферизацией операций записи операционной системой. по окончанииdouble write
После того, как страница написана,double wirite buffer
Страницы записываются в каждый файл табличного пространства.
В этом процессеdoublewrite
Последовательная запись, накладные расходы не большие, после завершенияdoublewrite
После написания, послеdouble write buffer
Запись в каждый файл табличного пространства, который в настоящее время является дискретным.
Если происходит сбой операционной системы во время записи страницы на диск, во время восстановления,InnoDB
Механизм хранения может получить доступ к общему табличному пространству изdouble write
Найдите копию страницы в , скопируйте ее в файл табличного пространства и примените журнал повторов.
InnoDB
Механизм хранения, часть 2: фоновые потоки
поток ввода-вывода
существуетInnoDB
использовал многоAIO(Async IO)
Выполнять обработку чтения и записи, что может значительно повысить производительность базы данных. существуетInnoDB 1.0
Есть 4 версии доIO Thread
, соответственнописать, читать, вставлять буфер и логировать поток, более поздние версии будутread thread
иwrite thread
Их стало 4, всего 10.
-read thread
: Отвечает за операции чтения, загрузку данных с диска в страницы кэша. 4
-write thread
: Отвечает за операции записи, сброс кэшированных грязных страниц на диск. 4
-log thread
: отвечает за сброс содержимого буфера журнала на диск. 1
-insert buffer thread
: Отвечает за сброс содержимого буфера записи на диск. 1
Purge
нить
После того, как транзакция зафиксирована, он используетundo
Журналы больше не потребуются, поэтомуPurge Thread
вернуть выделенныйundo
Страница.show variables like '%innodb*purge*threads%';
Page Cleaner
нить
Функция состоит в том, чтобы сбросить грязные данные на диск, и после того, как грязные данные будут сброшены на диск, соответствующиеredo log
Он также может быть перезаписан, то есть данные могут быть синхронизированы, и это может быть достигнутоredo log
цель утилизации. Будет вызывать обработку потока потока записи.show variables like '%innodb*page*cleaners%';
InnoDB
Механизм хранения, часть 3: файлы на диске
InnoDB
Основные файлы диска в основном разделены на три блока:Одно из них — системное табличное пространство, другое — пользовательское табличное пространство, а третье — табличное пространство.redo
лог-файлы и архивы.
бинарный файл(
binlong
) и т.д. файлыMySQL Server
Файлы, поддерживаемые слоями, поэтому не включеныInnoDB
в файле диска.
Системное табличное пространство и пользовательское табличное пространство
Системное табличное пространство содержитInnoDB
словарь данных (метаданные и связанные объекты) иdouble write buffer
, change buffer
, undo logs
зона хранения.
Системное табличное пространство также содержит по умолчанию табличные данные и данные индекса, созданные любым пользователем в системном табличном пространстве.
Системное табличное пространство является общим табличным пространством, потому что оно совместно используется несколькими таблицами.
Системное табличное пространство состоит из одного или нескольких файлов данных. По умолчанию 1 начальный размер составляет 10 МБ с именемibdata1
Файлы системных данных создаются в каталоге данных MySQL. пользователь может использоватьinnodb_data_file_path
Настройте размер и количество файлов данных.
innodb_data_file_path
Формат следующий:
innodb_data_file_path=datafile1[,datafile2]...
Пользователи могут формировать табличное пространство с помощью нескольких файлов и одновременно указывать атрибуты файлов:
innodb_data_file_path = /db/ibdata1:1000M;/dr2/db/ibdata2:1000M:autoextend
здесь будет/db/ibdata1
и/dr2/db/ibdata2
Эти два файла составляют системное табличное пространство. Если два файла находятся на разных дисках, нагрузка на диски может быть усреднена, что повышает общую производительность базы данных. За именами обоих файлов следует атрибут, указывающий, что файлibdata1
Размер файла 1000 МБ,ibdata2
Размер составляет 1000 МБ, и он может автоматически увеличиваться после исчерпания свободного места.
настраиватьinnodb_data_file_path
После параметра все на основеInnoDB
Данные таблицы механизма хранения будут записываться в системное табличное пространство, если установлен параметрinnodb_file_per_table
, пользователь может основывать каждыйInnoDB
Таблицы механизма хранения создают отдельное пользовательское пространство.
Правила именования для пользовательских табличных пространств: tablename.ibd. Таким образом, пользователю не нужно хранить все данные в системном табличном пространстве по умолчанию, но пользовательское табличное пространство хранит только данные таблицы, индексы и буфер вставки BITMAP и другую информацию, а остальная информация по-прежнему хранится в системное табличное пространство по умолчанию.
На рисунке ниже показаноInnoDB
Метод хранения подсистемы хранения для файлов, где файл frm представляет собой файл определения структуры таблицы, который записывает определение структуры таблицы для каждой таблицы.
файл журнала повторов (redo log file
) и архив
По умолчанию вInnoDB
В каталоге данных механизма хранения будут два файла с именами.ib_logfile0
иib_logfile1
файл, этоInnoDB
файл повтора (redo log file
), который записывает дляInnoDB
Журнал транзакций механизма хранения.
когдаInnoDB
Файлы журнала повторного выполнения могут пригодиться, когда в файлах хранилища данных .InnoDB
Механизм хранения может использовать файлы журнала повторного выполнения для восстановления данных в правильное состояние, чтобы гарантировать правильность и целостность данных.
каждыйInnoDB
Механизм хранения имеет как минимум один файл журнала повторов, а каждая файловая группа имеет как минимум два файла журнала повторов, а также файл журнала по умолчанию.ib_logfile0
иib_logfile1
.
Для повышения надежности пользователи могут настроить несколько групп зеркальных журналов и поместить разные группы файлов на разные диски, чтобы повысить доступность журналов повторного выполнения.
Размер каждого файла журнала повторов в группе журналов одинаков, и он работает в режиме [циклической записи].InnoDB
Механизм хранения сначала записывает в файл журнала повторов 1. Когда файл заполнен, он переключается на файл журнала повторов 2. Когда файл журнала повторов 2 также заполнен, он переключается на журнал повторов 1.
пользователь может использоватьInnodb_log_file_size
установить размер файла журнала повторов, что полезно дляInnoDB
Производительность механизма хранения имеет очень большое влияние.
Если файл журнала повторов задан слишком большим, восстановление после потери данных может занять много времени; с другой стороны, если файл журнала повторов задан слишком маленьким,checkpoint
Проверка требует частого сброса грязных страниц на диск, что приводит к дрожанию производительности.
Механизм сброса журнала повторов
InnoDB
Соблюдайте очистку файлов данных и файлов журналовWAL(write ahead redo log)
иForce-log-at-commit
Два правила, каждое из которых обеспечивает долговечность транзакции.WALПеред записью изменений данных на диск необходимо сначала записать на диск журнал в памяти;Force-log-at-commit
Требуется, чтобы при фиксации транзакции все сгенерированные журналы были сброшены на диск.Если данные в буферном пуле сбрасываются на диск после успешного сброса журнала, происходит сбой базы данных до того, как данные будут сброшены на диск. диск, то база данных может восстановить данные из журнала при перезапуске.
Как показано на фиг.InnoDB
Когда данные изменяются в пуле буферов, соответствующие изменения сначала записываются в буфер журнала повторов, а затем записываются на диск вовремя (например, механизм обновления каждую секунду) или когда транзакция фиксируется, что согласуется сForce-log-at-commit
Принцип: после того, как журнал повторов будет записан на диск, измененные данные в буферном пуле будут основаны наcheckpoint
механизм записи на диск, который соответствуетWALв общем.
существуетcheckpoint
В механизме синхронизации есть мнение, что файл журнала повторов заполнен, поэтому, как упоминалось выше, если файл журнала повторов слишком мал и часто полон, это часто приводит кcheckpoint
Записывает измененные данные на диск, вызывая колебания производительности.
Файловая система операционной системы кэшируется, когдаInnoDB
При записи данных на диск возможно, что они записываются только в кеш файловой системы, и никакой реальной «безопасности» нет.
InnoDB
изinnodb_flush_log_at_trx_commit
Свойства могут контролировать, когда каждая транзакция фиксируетсяInnoDB
поведение. Когда значение атрибута равно 0, когда транзакция зафиксирована, журнал повторов не будет записываться, а будет ждать, пока основной поток запишет вовремя; когда значение атрибута равно 1, когда транзакция зафиксирована, журнал повторов будет быть записаны в кеш файловой системы и вызыватьfsync
, данные в буфере файловой системы фактически записываются в дисковое хранилище, чтобы гарантировать отсутствие потери данных; когда значение атрибута равно 2, при фиксации транзакции файл журнала также будет записан в кэш файловой системы, но fsync вызываться не будет, и файловая система сама решает, когда записывать кеш на диск.
Механизм сброса журнала показан на следующем рисунке:
Innodb_flush_log_at_commit
даInnoDB
Основной параметр настройки производительности, включающийInnoDB
эффективность записи и безопасность данных. При значении параметра 0 эффективность записи самая высокая, но безопасность данных самая низкая; при значении параметра 1 эффективность записи самая низкая, но безопасность данных самая высокая; значение равно 1 для большей безопасности, и только когда установлено значение 1, можно гарантировать надежность транзакции.
использоватьUPDATE
предложение понятьInnoDB
механизм хранения
С вышеуказаннымInnoDB
Базовое введение в архитектуру механизма хранения, давайте еще раз проанализируем егоUPDATE
Специальный процесс обновления данных.
Делим эту картинку на две части: верхняя часть и нижняя часть, верхняя частьMySQL Server
Поток обработки слоя, следующая часть MySQL InnoDB
Поток обработки механизма хранения.
MySQL Server
Поток обработки слоя
Эта часть потока обработки не имеет ничего общего с механизмом хранения.Server
Конкретные шаги заключаются в следующем:
- Различные операции пользователя запускают выполнение sql в фоновом режиме через пул соединений с базой данных, который поставляется с веб-проектом: например,
dbcp、c3p0、druid
и т. д., установить сетевое соединение с пулом соединений базы данных сервера базы данных; - После того, как поток в пуле соединений с базой данных прослушивает запрос, он отвечает на полученный оператор SQL синтаксическому анализатору запросов через интерфейс SQL, а синтаксический анализатор запросов анализирует SQL в соответствии с синтаксисом SQL, чтобы выяснить, какие поля таблицы запрашивать. и каковы условия запроса;
- Затем с помощью обработки оптимизатора запросов выберите оптимальный набор планов выполнения для sq;
- Затем исполнитель отвечает за вызов ряда интерфейсов механизма хранения, выполнение плана и завершение выполнения всего оператора sql.
Эта часть процесса и та, что проанализирована вышеSelect
Анализ потока обработки запросов в основном такой же.
InnoDB
Поток обработки механизма хранения
Конкретный оператор выполнения должен быть завершен механизмом хранения, как показано на рисунке выше:
- Обновите в таблице пользователей этот фрагмент данных с id=10.Если в буферном пуле такого фрагмента данных нет, необходимо сначала загрузить исходные данные обновленных данных в буферный пул с диска.
- В то же время, чтобы обеспечить безопасность данных параллельного обновления, эти данные будут сначала заблокированы, чтобы предотвратить обновление других транзакций.
- Затем пропишите значение перед обновлением в бэкап
undo log
средний (для облегчения извлечения старых данных при откате транзакции), напримерupdate
Оператор сохраняет предыдущее значение обновляемого поля. - возобновить
buffer pool
Кэшированные данные в памяти являются самыми последними данными, тогда данные в памяти являются грязными данными в это время (данные в памяти несовместимы с данными на диске)
На этом процесс выполнения в пуле буферов завершен (как показано на рисунке выше).
-
После обновления данных в буферном пуле необходимо записать текущую информацию об обновлении в
Redo Log
Логи, потому что данные в памяти были изменены, а данные на диске не изменены.В это время, если машина, на которой находится MySQL, выходит из строя, измененные данные в памяти неизбежно будут потеряны.redo
Журнал предназначен для записи того, какие изменения вы внесли в данные, например, изменили значение поля имени для строки «id = 10». Это журнал, который используется для восстановления вас, когда MySQL внезапно выходит из строя. данные. Однако учтите, что в это времяRedo Log
Он еще не был помещен в файл журнала.В это время подумайте над вопросом: что, если MySQL не работает, если транзакция не была зафиксирована?
Выше мы знаем, что мы изменили данные памяти до сих пор, а затем записалиRedo Log Buffer
Буферизация журнала, если в это время происходит сбой MySQL, данные памяти иRedo Log Buffer
Все данные будут потеряны, но не имеет значения, потеряны ли данные в это время, потому что оператор обновления не фиксирует транзакцию, это означает, что она не была выполнена успешно.В это время, хотя время простоя MySQL вызывает данные в памяти будут потеряны, вы обнаружите, что на диске данные остались прежними.Следующее, что нужно представить, это в настоящее время в соответствии с определенной стратегией.
redo
войти изredo log buffer
Кисть в файл на диске, на данный момент эта стратегия черезinnodb_flush_log_at_trx_commit
настроить.-
innodb_flush_log_at_trx_commit=0
, указывая на то, что совершение действий не поставитredo log buffer
Если данные в памяти сбрасываются в файл на диске, возможно, вы отправили транзакцию в это время, и в результате mysql не работает, а затем все данные в памяти в это время потеряны, поэтому этот метод не рекомендуется. -
innodb_flush_log_at_trx_commit=1
,redo log
Сбросить из памяти в файл на диск, пока транзакция успешно зафиксирована, затемredo log
Он должен быть на диске, поэтому, если в это время произойдет сбой MySQL, вы можетеRedo Log
Данные восстановления журнала. -
innodb_flush_log_at_trx_commit=2
, при фиксации транзакции записывать журнал повторов в соответствующий файл на дискеos cache
Перейти в кеш, вместо того, чтобы сразу перейти к файлу на диске, это может занять 1 секунду, чтобы поставить егоos cache
Данные записываются в файл на диске.
-
-
При совершении транзакции он также напишет
binlog
,binlog
Существуют также различные стратегии чистки зубов.sync_binlog
параметры можно контролироватьbinlog
, его значение по умолчанию равно 0, в это время вы ставитеbinlog
При записи на диск на самом деле происходит не прямой вход в файл на диске, а вводos cache
кеш памяти. Как правило, чтобы гарантировать, что данные не будут потеряны, мы настроим стратегию Double 1.Redo Log
иBinlog
Выберите 1 для стратегии размещения. -
Binlog
После размещенияBinlog
имя файла, информацию о пути, где находится файл, иcommit
Отметить для синхронной последовательной записи вRedo log
, смысл этого шага в том, чтобы сохранитьredo log
войти сbinlog
Логи совпадают.commit
Отметка является важным критерием для оценки того, успешно ли завершена транзакция.Например, если MySQL аварийно завершает работу после успешного выполнения 5-го или 6-го шага, на этот раз из-за отсутствия финальной транзакции.commit
отмечено вredo
log, поэтому эту транзакцию можно считать неудачной. не скажуredo
В лог-файле есть лог этого обновления, ноbinlog
В лог-файле нет лога этого обновления, поэтому несоответствия данных не будет. -
После выполнения вышеуказанного данные в памяти были изменены, транзакция была отправлена, и журнал был помещен на диск, но данные на диске не были изменены синхронно.
InnoDB
В фоновом режиме механизма хранения существует поток ввода-вывода, который будет обновлять данные в пуле буферов, обновленные транзакцией, но еще не записанные на диск (грязные данные, поскольку данные диска и данные памяти уже разные) во время низкого пика нагрузки на базу данных на диск для завершения персистентности транзакции.
такInnoDB
Процесс обработки записи можно представить следующей картинкой
Связанные вопросы интервью
Вопрос: Нужно ли блокировать буферный пул при доступе к нему?
Вопрос: Как инициализировать базу данных при ее запускеBuffer Pool
из?
Ответ: сначала нужно узнатьBuffer Pool
Что это такое, как он выглядит Пул буферов был представлен выше. Пул буферов будет содержать много страниц кэша, и каждая страница кэша также имеет данные описания (эту информацию описания можно в целом считать используемой для описания Кэш-страница, например, содержит следующие вещи: табличное пространство, к которому принадлежит страница данных, номер страницы данных, кэш-страница вBuffer Pool
адрес в , и некоторые другие разные вещи. ),Как показано ниже:
На самом деле это тоже очень просто, пока база данных запущена, она будет следовать заданным вами настройкам.Buffer Pool
Размер, немного больший, переходит в операционную систему, чтобы подать заявку на область памяти, т.к.Buffer Pool
область памяти. Затем, когда приложение области памяти будет завершено, база данных будет следовать размеру страницы кэша по умолчанию, равному 16 КБ, и соответствующему размеру данных описания, равному примерно 800 байтам.Buffer Pool
Страницы кэша делятся одна за другой, а соответствующие им данные описания — одна за другой.
Вопрос: Как база данных узнает, какие страницы данных свободны?
A: Страницы данных и страницы кэша на диске находятся во взаимно однозначном соответствии, обе по 16Кб, и одна страница данных соответствует одной странице кэша. База данных будетBuffer Pool
дизайн одинfree
Связный список, он представляет собой структуру данных двусвязного списка, этоfree
В связанном списке каждый узел является адресом блока данных описания свободной страницы кеша, то есть, пока одна из ваших страниц кеша свободна, его блок данных описания будет помещен в этотfree
в связанном списке. Когда база данных запускается впервые, все страницы кэша могут быть свободны, потому что в это время это может быть пустая база данных без данных, поэтому блоки данных описания всех страниц кэша в это время будут помещены в этот блок.free
связанный список, среди прочего, этоfree
Связанный список имеет базовый узел, который ссылается на головной узел и хвостовой узел связанного списка, а также хранит количество узлов в связанном списке, описывающих блок данных, то есть сколько свободных страниц кэша имеется.
Вопрос: Как узнать, кэшируется ли страница данных?
Ответ: При выполнении CRUD сначала проверьте, была ли кэширована страница данных.free
Найдите свободную страницу кеша в связанном списке, прочитайте страницу данных с диска и запишите страницу кеша, запишите данные описания, изfree
Удалить блок описания из связанного списка. Но если страница данных была кэширована, она будет использоваться напрямую.
Таким образом, база данных также будет иметь структуру данных хеш-таблицы, он будет использовать номер табличного пространства + номер страницы данных в качестве ключа, а затем адрес страницы кэша в качестве значения. Если вы хотите использовать страницу данных, используйте «номер табличного пространства + номер страницы данных» в качестве ключа для проверки этой хэш-таблицы, если нет, прочитайте страницу данных и запишите страницу кеша, а в хэш-таблице напишите ключ-значение пара, ключ — номер табличного пространства + номер страницы данных, а значение — адрес страницы кэша, если
Если он уже существует, это означает, что страница данных была закэширована.
Вопрос: Какие данные находятся в области холодных данных связанного списка LRU?
Ответ: Большинство страниц кеша должны быть предварительно прочитаны и загружены, и никто не будет обращаться к ним через 1 с после загрузки.Тогда, включая полное сканирование таблицы или какие-то большие запросы, загрузка кучи данных в страницы кеша, результаты все в пределах 1. После посещения его некоторое время данные этих таблиц больше не будут доступны в будущем. Подобно этим данным, все они будут помещены в холодную область данных.
проблема:Buffer Pool
Будет ли фрагментация памяти?
О: Конечно, будет, потому чтоBuffer Pool
Размер устанавливается самостоятельно, скорее всегоBuffer Pool
После разделения всех страниц кеша и блоков данных описания остается немного памяти, и эта небольшая память не может содержать никаких страниц кеша, поэтому эту память можно только хранить и нельзя использовать, что является фрагментацией памяти.
Так как же уменьшить фрагментацию памяти?
На самом деле это очень просто, база данных находится вBuffer Pool
При разделении страниц кэша посередине все страницы кэша и блоки данных описания располагаются близко друг к другу, чтобы максимально сократить потери памяти и максимально уменьшить фрагментацию памяти.
Вопрос: Как грязные страницы сбрасываются на диск?
Ответ: Грязные страницы образуются путем модификации данных в буферном пуле, что приводит к несоответствию между данными в памяти и данными на диске. Обновление грязных страниц заключается в синхронизации страниц с измененными данными с диском. Хранить все страницы в буфере невозможно бассейн.Обновить, как найти эти грязные тоже очень важно,MySQL
Обработка такая же, как и для бесплатных страниц.
База данных здесь представляет еще одинfree
похожий связанный списокflush
связанный список, этоflush
Суть связанного списка заключается в использовании двух указателей в блоке данных описания страницы кэша, чтобы сделать блок данных описания модифицированной страницы кэша двусвязным списком. Для любой кешированной страницы, которая была изменена, ее блок данных описания будет добавлен вflush
к связанному списку,flush
Это означает, что это грязные страницы, и продолжение должноflush
слить на диск.
проблема:undo log
иredo log
Ты понимаешь? Каковы их функции?
отвечать:undo log
иredo log
находится в mysqlInnoDB
Базовый состав механизма хранения:
-
undo log
Значение данных перед транзакцией сохраняется, чтобы при откате транзакции можно было вернуть версию данных до транзакции.undo log
цепочка версий; -
redo log
Ряд информации об операциях транзакций записывается на физическом уровне, чтобы гарантировать, что даже в случае сбоя mysql и других факторов данные еще не были сброшены на диск.redo log
Данные, зафиксированные транзакциями, также могут быть восстановлены.
проблема:redo log
Как сделать так, чтобы транзакции не терялись?
Ответ. После успешной отправки транзакции, несмотря на то, что данные в пуле буферов могут не попасть на диск вовремя,redo log
Записанная информация о транзакции сохраняется на диске и содержитcommit
Отметьте, в это время, если mysql не работает и данные памяти в пуле буферов, которые были обновлены транзакцией, потеряны, при перезапуске mysql данные на диске будут изменены.redo log
Информация об изменении транзакции загружается в пул буферов, чтобы гарантировать, что информация о транзакции не будет потеряна. илиredo log
матовый,binlog
Запись прошла успешно, она будет автоматически дана при перезапускеcommit
отметить и воспроизвести данные.
Вопрос: транзакция фиксируется первой или сначала сбрасывается?
A: Транзакция сначала отправляется, а затем обновляется;
-
Redo log
Кисть успешно -
Binlog
щетка -
BinLog
информация об имени и пути к файлу,commit
знак, написанныйRedo log
, транзакция гарантируется двухфазной фиксацией.
Вопрос: Почему операция обновления не обновляет диск напрямую, а проектирует такую сложнуюInnoDB
движок хранения доделать?
A: Непосредственное обновление диска — это случайная запись ввода-вывода, существует операция адресации диска, производительность очень низкая, и она не может поддерживать сценарии с высокой степенью параллелизма; вместо этого она преобразуется вInnoDB
средняя, высокоскоростная память для чтения и записи,redo log
иundo log
Производительность диска с последовательной записью намного выше, чем производительность случайной записи ввода-вывода, и это улучшение производительности может компенсировать сложность этой архитектуры и может поддерживать сценарии с высокой степенью параллелизма в пределах определенного количества запросов в секунду.
Ссылка на данные:
«Возьмите вас, чтобы стать мастером боевой оптимизации MySQL с нуля»
"Инсайдер технологии MySQL - механизм хранения InnoBD"