механизм хранения
Во многих статьях сразу начинаются сведения о том, какие механизмы хранения доступны, а не о самом механизме хранения. Так что же такое механизм хранения? Я не знаю, задумывались ли вы когда-нибудь о том, как MySQL хранит данные, которые мы вбрасываем?
На самом деле механизм хранения тоже очень прост, я думаю, что это решение для хранения, которое реализует такие функции, как добавление данных, обновление данных и построение индексов.
Какие существующие механизмы хранения мы можем выбрать?
InnoDB, MyISAM, Память, CSV, Архив, Blackhole, Слияние, Объединение, Пример
Существует много типов, но наиболее часто используемыми механизмами хранения в настоящее время являются только InnoDB и MyISAM.Я также сосредоточусь на представлении этих двух механизмов хранения.
В настоящее время InnoDB является наиболее широко используемой системой хранения данных MySQL, начиная с версии 5.5. Итак, вы знаете, почему InnoDB широко используется? Давайте сначала отложим этот вопрос, давайте сначала разберемся в основных принципах механизма хранения InnoDB.
Архитектура памяти InnoDB в основном разделена на три блока:буферный пул(буферный пул),пул буферов повторного выполнения(буфер журнала повторов) идополнительный пул памяти
буферный пул
InnoDB хранит данные на диске для сохранения данных. Однако перед лицом большого количества запросов разрыв между скоростью обработки ЦП и скоростью ввода-вывода диска слишком велик.Чтобы повысить общую эффективность, InnoDB представилабуферный пул.
Когда есть запрос на запрос данных, если пула кеша нет, он пойдет на диск, чтобы найти его, и поместит соответствующие данные в пул кеша. Точно так же, если есть запрос на изменение данных, MySQL не будет изменять диск напрямую, а будет изменять данные, уже находящиеся на страницах пула буферов, а затем сбрасывать данные обратно на диск.Это роль буфера pool для ускорения чтения. , для ускорения записи и уменьшения взаимодействия ввода-вывода с диском.
Проще говоря, пул буферов должен перебрасывать данные с диска в память, а поскольку это память, то места для выделения памяти не будет. Таким образом, буферный пул используетLRUАлгоритм исключения страниц, когда в буферном пуле нет свободных страниц. Но использование этого алгоритма приводит к проблеме, называемойЗагрязнение буферного пула.
Когда вы выполняете пакетное сканирование или даже полное сканирование таблицы, все горячие страницы в буферном пуле могут быть заменены. Это может привести к скал, подобно капли в производительности MySQL. Так что InnoDB сделал некоторые оптимизации LRU, чтобы избежать этой проблемы.
MySQL используетвойти первым, перед фактической записью данных сначала будет записан журнал, который называетсяRedo Log, будет регулярно использовать технологию CheckPoint для сброса нового журнала повторов на диск, что будет обсуждаться позже.
В дополнение к данным он также хранит индексные страницы, страницы отмены, буферы вставки, адаптивные хэш-индексы, информацию о блокировках InnoDB и словари данных. Ниже приведены некоторые из наиболее важных из них, о которых следует кратко рассказать.
вставить буфер
Операция буферизации вставки — update или insert Мы рассматриваем наихудший случай, то есть данные, которые нужно обновить, находятся не в пуле буферов. Тогда возможны следующие два варианта.
- Записать часть данных прямо на диск
- Подождите, пока данные не достигнут определенного порога (например, 50), прежде чем записывать на диск партиями.
Очевидно, что второе решение немного лучше, уменьшая взаимодействие с дисковым вводом-выводом.
написать дважды
Теперь, когда мы поговорили о буферизации вставки, я должен сказать пару слов.написать дважды, потому что я думаю, что эти две функции InnoDB дополняют друг друга.
вставить буферповышает производительность MySQL, анаписать дваждыНа этой основе повышается достоверность данных. Мы знаем, что когда данные все еще находятся в пуле буферов, когда машина выходит из строя, происходитнаписать признание недействительным, есть Redo Log для восстановления. Но что, если он выйдет из строя во время сброса данных из пула буферов обратно на диск?
Эта ситуация называется частичной ошибкой записи, и журнал повторов не решает проблему.
При очистке грязных страниц она не зачищается напрямую на диск, а копируется в буфер Doublewrite в памяти, а затем копируется в разделяемое табличное пространство диска (можно понимать под диском), записывая каждый раз по 1М и т.д. Копировать после После завершения страницы из буфера двойной записи записываются в файл на диске.
Благодаря механизму двойной записи, даже если произойдет сбой при сбросе грязной страницы, копия страницы буфера двойной записи может быть найдена в общем табличном пространстве при восстановлении экземпляра, и она может напрямую перезаписать исходную страницу данных.
Адаптивный хэш-индекс
Адаптивная индексация похожа на то, как JVM будет динамически компилировать некоторый горячий код в машинный код во время выполнения процесса InnoDB будет отслеживать запрос всех индексов и строить хэш-индекс на страницах, к которым обращаются горячие точки, чтобы улучшить скорость доступа. .
Возможно, вы видели ключевое слово несколько разСтраница, тогда давайте поговорим о том, что такое страница?
Страница
Страница, является наименьшей единицей управления данными в InnoDB. Когда мы запрашиваем данные, он загружает данные с диска в буферный пул в единицах страниц. Точно так же обновление данных также происходит в единицах страниц, сбрасывая наши изменения данных обратно на диск. Размер каждой страницы по умолчанию 16k, и каждая страница содержит несколько строк данных Структура страницы показана на рисунке ниже.
Не беспокойтесь слишком много о том, для чего предназначена каждая область, нам просто нужно знать, в чем преимущества этого дизайна. Доступ к данным для каждой страницы можно получить черезFileHeaderДанные предыдущей и следующей страниц вДвусвязный список. Потому что в реальном физическом хранилище данные не хранятся постоянно. Вы можете понять это как распределение региона G1 в памяти.
и одна страница содержитДанные ряда, линии между линиями образуютОдносвязный список. Данные строки, которые мы храним, в конечном итоге попадут вUser Records, разумеется, изначально User Records не занимают места для хранения. Поскольку мы храним все больше и больше данных,User Recordsбудет становиться все больше и больше,Free SpaceПространство будет становиться все меньше и меньше, пока оно не будет занято, и будет применена новая страница данных.
Данные в пользовательских записях сортируются в соответствии с идентификатором первичного ключа. Когда мы ищем в соответствии с первичным ключом, мы будем искать в обратном направлении по этому односвязному списку.
буферизация журнала повторов
Как обсуждалось выше, обновление данных страницы в пуле буферов в InnoDB будет обновлено до обновления данных на диске, и InnoDB также будет использовать стратегию опережающей записи для обновления данных.Что это значит? Когда транзакция начинается, журнал повторов сначала записывается в буфер журнала повторов, а затем обновляются данные страницы пула буферов.
Данные в буфере журнала повторов будут записываться в журнал повторов с определенной периодичностью. Измененные страницы отмечены значкомгрязные страницы, InnoDB сбрасывает грязные страницы на диск в соответствии с механизмом CheckPoint.
бревно
Выше упоминался журнал Redo. В этом разделе мы поговорим конкретно о журнале. Журнал разделен на следующие два измерения.
Уровень MySQL
Уровень InnoDB
Логи MySQL
Журналы MySQL можно разделить на журналы ошибок, двоичные файлы, журналы запросов и полные журналы запросов.
- журнал ошибокХорошо понятно, что это серьезный журнал ошибок, возникающий во время работы сервиса. Когда наша база данных не запускается, мы можем прийти сюда, чтобы узнать, в чем причина сбоя запуска
- бинарный файлУ него есть еще одно имя, с которым вы должны быть знакомы, называемоеBinlog, который фиксирует все изменения в базе данных.
- журнал запросовВсе заявления от клиента регистрируются
-
журнал медленных запросовЗдесь записываются все операторы SQL, время отклика которых превышает пороговое значение, которое мы можем установить сами.
long_query_time
, его значение по умолчанию — 10 с, а значение по умолчанию —закрытиестатус, его нужно открыть вручную.
Журналы InnoDB
Существует только два типа журналов InnoDB: журнал повторов и журнал отмен.
-
Redo LogЖурнал повторов используется для записи изменений операции транзакции, и записывается значение после модификации. Будет ли транзакция зафиксирована или нет, будет записано. Например, при обновлении данных обновленная запись сначала будет записана в журнал повторов, а затем будут обновлены данные на странице в кэше. Затем, в соответствии с установленной политикой обновления, данные из памяти сбрасываются обратно на диск.
-
Undo LogЗапись представляет собой версию до начала записанной транзакции и может использоваться для откатов, происходящих после сбоя транзакции.
Журнал повторов записывает изменения на определенной странице данных, которую можно использовать только на текущем сервере, в то время как Binlog можно понимать как используемый другими типами механизмов хранения. Это также важная роль Binlog, т.е.репликация master-slave, еще один эффектВосстановление данных.
Как было сказано выше, все изменения в БД фиксируются в Бинлоге, а лог имеет три формата. Это Statement, Row и MixedLevel соответственно.
- StatementЗапишите все SQL, которые будут изменять данные, он будет записывать только SQL, ему не нужно записывать все строки, затронутые этим SQL,Уменьшенный объем журнала, что повышает производительность. Однако, поскольку записывается только оператор выполнения, нельзя гарантировать его правильное выполнение на ведомом узле, поэтому необходимо записать дополнительную контекстную информацию.
- RowСохраняются только измененные записи.По сравнению с оператором только записывает выполнение SQL, Row будет генерировать большое количество журналов. Но Row не нужно записывать контекстную информацию, просто обратите внимание на то, что изменилось.
- MixedLevelЭто смесь Statement и Row.
Какой журнал использовать, зависит от реальной ситуации. Например, инструкция UPDATE обновляет много данных. Использование инструкции сэкономит место, но в относительном отношении строка будет более надежной.
Разница между InnoDB и MyISAM
Поскольку MyISAM используется нечасто, я не собираюсь углубляться в некоторые из его основных принципов и реализаций. Здесь мы просто сравниваем различия между этими двумя механизмами хранения. Опишем по крупицам.
- делаInnoDB поддерживает транзакции, откаты, безопасность транзакций и восстановление после сбоев. MyISAM не поддерживает, но скорость запросов выше, чем у InnoDB.
- первичный ключInnoDB предусматривает, что если первичный ключ не установлен, автоматически генерируется 6-байтовый первичный ключ, в то время как MyISAM допускает существование не индекса, а первичного ключа, а индексом является адрес строки
- иностранный ключInnoDB поддерживает внешние ключи, а MyISAM — нет.
- блокировка столаПоддержка InnoDBблокировка строкиа такжеблокировка стола, тогда как MyISAM поддерживает только блокировки таблиц
- Полнотекстовый индексInnoDB не поддерживает полнотекстовое индексирование, но для реализации соответствующих функций можно использовать плагины, а сам MyISAM поддерживает полнотекстовое индексирование.
- РядыКогда InnoDB получает количество строк, ему необходимо просмотреть всю таблицу. MyISAM сохраняет общее количество строк в текущей таблице, которое можно прочитать напрямую.
Таким образом, чтобы подвести краткий итог, MyISAM подходит только для сценариев, где запрос больше, чем обновление.Если ваша система запрашивает подавляющее большинство (например, система отчетности), вы можете использовать MyISAM для хранения.Кроме того, рекомендуется использовать InnoDB.
End
Из-за нехватки времени в этой статье лишь кратко рассказывается об общей архитектуре InnoDB и не обсуждаются некоторые моменты подробно. Например, как улучшена InnoDB для решения проблемы загрязнения пула буферов, каков ее алгоритм, как работает контрольная точка и т. д., просто сделайте краткое понимание и поговорим об этом позже, если у вас будет время.
Если вы считаете, что эта статья полезна для вас, не волнуйтесь.поставить лайк,обращать внимание,Поделиться,оставьте сообщение
Вы также можете выполнить поиск в общедоступной учетной записи WeChat [Заметки о полном стеке SH], конечно, вы также можете напрямую сканировать QR-код, чтобы следовать
В этой статье используетсяmdniceнабор текста