Есть чувства, есть галантерейные товары, поиск в WeChat【Третий принц Ао Бин] Обратите внимание на этого другого программиста.
эта статьяGitHub github.com/JavaFamilyВключено, и есть полные тестовые площадки, материалы и мой цикл статей для интервью с производителями первой линии.
предисловие
Система была подключена к сети на прошлой неделе, и было обнаружено, что запрос выполняется медленно при большом объеме данных. После расследования выяснилось, что сестра, отвечающая за эту функцию, не указала первичный ключ при построении таблицы.
После жесткой критики моя сестра грустно плакала: Санвай сказал не использовать uuid в качестве первичного ключа, поэтому я удалил uuid.
Я: Дурак не позволяет вам использовать uuid в качестве первичного ключа, дело не в том, что вы не используете первичный ключ.
Глядя на грустное выражение лица сестры, я немного смягчил тон, знаешь, почему тебе не разрешают использовать uuid?
Когда я задавал ей вопросы, она и окружавшие ее сестры отвечали расплывчато, и она отмахнулась от меня, сказав: «Это приведет к замедлению операций письма».
Я совсем не злился, я знал, что мне пора притворяться, я взял сестрички за ручонки, сел вокруг себя и сказал:
Это показывает, что вы не знаете структуру хранения mysql.Я объясню вам структуру хранения базы данных, вставив часть данных в таблицу.
Табличное пространство/табличное пространство
Если я хочу быть писателем, я хочу написать длинный роман, тогда мне нужно записать слова на бумаге. Первый шаг — купить на бумажной фабрике два больших рулона неразрезанной белой бумаги. Соответственно, в компьютере все данные также необходимо записывать на носители информации, такие как магнитные диски, магнитные ленты и оптические диски для длительного хранения.
Эти носители разделены на файлы, которые представляют собой физические пространства, в которых хранятся данные.
Поскольку я купил два рулона бумаги, и на любом из них можно хранить текст, каждый раз, когда я начинаю писать, мне сложно решить: на какой рулон мне записать? Это несчастье для меня, у которого трудности с выбором.
Итак, я планирую попросить секретаря продиктовать ему то, что я хочу написать, и помочь мне расшифровать это на конкретном свитке через него.Мне все равно, на каком свитке я пишу.
Точно так же при работе с файлом в программе сначала нужно указать путь к файлу. Однако в базе данных таблица ориентирована на разработку, а запоминающее устройство — на эксплуатацию и обслуживание. При разработке и создании таблиц сложно определить, какому файлу соответствует таблица. Эксплуатация и обслуживание также будут динамически добавлять файлы в базу данных в соответствии с реальной ситуацией.
Тесная связь между таблицами и файлами сильно ограничивает удобство использования базы данных, поэтому логично добавить слой табличного пространства между файлами и таблицами, который соединяет таблицы вверх и файлы вниз; разработчикам нужно только оперировать таблицами в табличном пространстве, а конкретное хранилище автоматически поддерживается механизмом хранения Innodb в соответствии с табличным пространством.
Табличное пространство является высшим уровнем логической структуры механизма хранения InnoDB, и все данные логически хранятся в табличном пространстве.
Табличные пространства в основном включают следующие типы:
- системное табличное пространство Хранит метаданные для буфера изменений, буфера двойной записи и всех объектов, связанных с innodb. Такие как: табличное пространство и информация о базе данных, структура таблицы и информация о полях и так далее. Файл .frm, первоначально использовавшийся для хранения информации о структуре таблицы, был удален в mysql8.0, и все метаданные хранятся в этом системном табличном пространстве. Соответствующие базовые представления в библиотеке information_schema системного табличного пространства следующие:
Если в мире базы данных есть соответствующая таблица user table, тест выглядит следующим образом: Запросите информацию о табличном пространстве, которому принадлежит таблица: выберите * из information_schema.innodb_tablespace, где name='world/user'; (пробел: идентификатор табличного пространства, имя: имя табличного пространства)
Запросите информацию файла данных, соответствующую табличному пространству: выберите * из information_schema.files, где tablespace_name='world/user'; (file_name: относительный путь к файлу данных)
Идентификатор, соответствующий таблице запроса: выберите * из information_schema.innodb_tables, где name='world/user';
Запрос номера страницы корневого узла, соответствующего индексу первичного ключа (номер корневой страницы) выберите * из information_schema.innodb_indexes, где table_id=1269 и name='primary'; (page_no: номер корневой страницы дерева B+; name='primary' означает индекс первичного ключа)
Системное табличное пространство также имеет соответствующий файл данных, который по умолчанию (в Windows) xxx\MySQL Server 8.0\Data\ibdata1. Только системное табличное пространство может указывать несколько файлов, а другие типы табличных пространств могут указывать только один файл данных.
-
независимое табличное пространство Каждая таблица соответствует независимому табличному пространству. Запустите независимое табличное пространство, настроив параметры в my.ini: innodb_file_per_table=1, в противном случае по умолчанию используется системное табличное пространство. Эта конфигурация включена по умолчанию после версии 5.6.6, поэтому по умолчанию используется отдельное табличное пространство.При создании таблицы для нее автоматически создается табличное пространство, соответствующее имени таблицы, и в каталоге базы данных создается файл табличного пространства с именем "tablename.ibd". Например: результат создания пользовательской таблицы в мире базы данных выглядит следующим образом
-
обычное табличное пространство То есть табличное пространство создается вручную с помощью «создать табличное пространство с именем табличного пространства».
-
временное табличное пространство Храните временные таблицы и сегменты отката, соответствующие изменениям во временной таблице. Временный файл по умолчанию (в Windows) xxx\MySQL Server 8.0\Data\ibtmp1
Площадь/кластер/экстент
Так как рулон оригинальной бумаги слишком большой, то после разматывания им может покрыться десяток, а то и десятков этажей моего особняка, что очень неудобно в использовании, ведь в моем особняке в 9 кв. гости. Лучше всего разрезать эти листы на страницы данных формата А4.
Точно так же емкость диска или файла также очень значительна и крайне неудобна в управлении, поэтому innodb делит файл на блоки хранения одинакового размера, которые также называются страницами;Для литературного рассказа, если номер страницы можно использовать для поиска следующей страницы по очереди, чтобы полностью прочитать рассказ. Обычно, когда мы заканчиваем читать первую страницу, мы сразу же читаем вторую страницу, но если соответствующие страницы разбросаны по спальне, туалету и гостиной, впечатления от чтения сильно уменьшатся. Если стоимость переплета этих разбросанных страниц может быть значительно снижена, удобство чтения может быть значительно улучшено.
Согласно принципу локальности, когда процессор использует данные, он с большой вероятностью будет использовать и логически соседние данные на следующем шаге. Поэтому, чтобы повысить производительность операций чтения данных, innodb максимально хранит логически смежные данные на соседних страницах, для достижения этой цели в Innodb вводится понятие области/кластера;
Область/кластер — это сегмент пространства, постоянно выделяемый физически, а экстент делится на последовательные страницы для хранения данных одной и той же логической единицы (например, следующего сегмента индекса и сегмента данных). Область/кластер по умолчанию состоит из 64 последовательных страниц (страниц), а размер каждой страницы по умолчанию составляет 16 КБ.
Фактически, innodb сначала делит файл на последовательные области/кластеры, а затем делит последовательные страницы на область/кластер.В общем, файл состоит из ряда последовательных страниц на микроскопическом уровне, а также на макроскопическом уровне. Состоит из ряда смежных регионов/кластеров. Зная номер страницы и размер страницы страницы, можно рассчитать конкретное расположение этой страницы на диске. Аналогичным образом, зная номер страницы, можно рассчитать размер области/кластера и в какой области/кластере находится страница. у него нет самого номера, но если предположить, что первая область/кластер имеет номер 0, вы можете логически узнать, какой это номер).
Если страницу рассматривать как страницу настоящей книги, то экстент можно рассматривать как настоящую книгу..
Целью экстента является выделение непрерывного пространства для логических единиц, и он также используется для управления состоянием пространства хранения в пределах экстента (например, какие страницы в экстенте заполнены, какие не используются и какие содержат фрагментацию). В частности, состояние пространства самой области указывается различными связанными списками области/кластера, а состояние пространства страницы в области указывается XDES_BITMAP в записи XDES).
###Сегмент/Сегмент
После того, как Да Лю написал первую книгу «Задача трех тел», он долго не обновлял ее, но из-за того, что содержание было слишком захватывающим, Обама написал электронное письмо и призвал к этому дипломатическими средствами. Чтобы не навредить китайско-американским отношениям, Лю последовал его примеру и написал еще две книги подряд.
Три книги с логически связными историями обычно называют трехчастными, поэтому мы называем такие связанные книги набором. Точно так же innodb приписывает логически связанные области/кластеры сегменту.
Чтобы одна и та же логическая единица могла иметь физически непрерывное пространство для хранения, Innodb предложила концепцию области, но минимальной операционной единицей ввода-вывода является страница, один ввод-вывод не может заполнять область, а данные могут быть стерты (удалены) повторно. , поэтому необходимо записывать саму область и статус пространства области: какие области заполнены, какие области не используются, а какие области имеют фрагментированное пространство.
В innodb управляющая информация, которая записывает состояние пространства хранения связанной области, называется сущностью сегмента, а сумма областей, управляемых сущностью сегмента, называется сегментом. Сегмент предназначен для управления использованием области и предоставления статуса хранения пространства при выделении места для данных.
Дуань можно также рассматривать как набор книг в действительности..
Данные в innodb организованы в виде дерева B+, конечные узлы хранят ключевые слова и данные строк, а неконечные узлы хранят ключевые слова (данные индекса) и номера страниц. Данные индекса и данные бизнес-строки имеют разные структуры данных, поэтому они хранятся отдельно.Данные индекса неконечных узлов хранятся в одном сегменте, а бизнес-данные конечных узлов хранятся в другом сегменте.Соответствующие также хранится в разных сегментах, в разделах и на страницах структуры.
Логическая структура данных следующая:
Физическая структура хранилища выглядит следующим образом:Сегмент является логической частью табличного пространства и используется для хранения данных с тем же значением, например нелистовой узел в паре B+ или конечный узел в дереве B+. Общие сегменты включают сегмент данных, сегмент индекса, сегмент отката и т. д.
При каждом создании индекса создаются два сегмента: один — это сегмент данных (конечный узел, соответствующий дереву B+), а другой — сегмент индекса (неконечный узел). Для кластеризованного индекса (обычно индекса с первичным ключом) в сегменте данных хранятся ключ индекса и бизнес-строки (все поля); для некластеризованного индекса в сегменте данных хранятся ключ индекса и первичный ключ; -кластеризованный индекс, вам нужно сначала найти первичный ключ через дерево B+, а затем запрашивается конкретная строка из кластеризованного индекса через первичный ключ, который называется таблицей возврата. Рисунок ниже: слева — вторичный индекс (некластеризованный индекс), справа — индекс первичного ключа (кластеризованный индекс)
Данные таблицы организованы и сохранены через кластеризованный индекс, то есть дерево B+, созданное индексом первичного ключа, хранит данные, поэтому первичный ключ должен быть указан одновременно при создании таблицы. Если первичный ключ не указан и уникальный индекс не создан, таблица по умолчанию создаст самоувеличивающееся скрытое поле: row_id в качестве ключевого поля кластеризованного индекса B+ дерева. Поскольку это скрытое поле, его можно использовать только при обратном запросе к таблице.
Страница/Страница
Как упоминалось выше, страница в действительности похожа на страницу книги, и это наименьшая единица операции ввода-вывода в innodb.Страницы innodb похожи на страницы настоящей книги..
Размер страницы по умолчанию 16КБ, задается параметром innodb_page_size, варианты: 4КБ, 8КБ, 16КБ, 32КБ, 64КБ; Когда размер страницы составляет 4, 8 или 16 КБ, количество страниц, соответствующих экстенту, изменяется синхронно, чтобы гарантировать, что размер экстента (области/кластера) останется неизменным на уровне 1 МБ. Когда размер страницы составляет 32 КБ или 64 КБ, количество страниц в экстенте гарантированно останется неизменным, а синхронизация экстента станет равной 2М и 4М;
Каждая страница имеет соответствующий номер, начинающийся с 0, который называется номером страницы. Поскольку файл данных табличного пространства будет разбит на страницы одинакового размера, то, зная номер страницы, а затем и по начальной позиции файла, можно вычислить точный адрес страницы на диске.
Точно так же таблица соответствует кластеризованному индексу, а номер страницы корневой страницы указан в метаданных кластерного индекса, поэтому механизм Innodb может вычислить точный адрес корневой страницы индекса B+ дерева по странице число и размер страницы, с тем чтобы проанализировать всю таблицу данных для работы.
Страница в основном используется для хранения бизнес-данных, но экстенты и информация о сегментах, которые существуют для управления распределением памяти, также нуждаются в хранении страниц. Innodb делится на следующие категории в зависимости от содержимого хранилища страниц:
-
Страница FSP HDR: Табличное пространство может соответствовать нескольким файлам данных, каждый со своим номером. Табличное пространство является структурой верхнего уровня в базе данных.Через метаданные в системном табличном пространстве вы можете запрашивать метаданные соответствующего файла табличного пространства и т. д., но вы не можете запрашивать сегмент, область и другую информацию, соответствующую текущему табличному пространству. , поэтому вы не можете получить информацию в табличном пространстве Состояние хранения страницы.
Чтобы физическое хранилище табличного пространства имело запись внешнего доступа, указывается, что страница 0 файла 0 в табличном пространстве хранит информацию о табличном пространстве и указатель связанного списка сегментов, принадлежащего текущей таблице. космос.
Любая страница состоит из заголовка, основной части и нижнего колонтитула.
Размер страницы по умолчанию составляет 16 КБ, а количество данных указателя, соответствующих сегментам и областям, невелико, поэтому можно сохранить только часть информации заголовка. Большая часть оставшегося пространства используется для хранения части информации об объектах зоны волос, принадлежащей текущему табличному пространству.
Заголовок страницы: указывает текущий номер страницы, тип и табличное пространство, к которому она принадлежит. Нижний колонтитул: в основном используется для проверки данных. Тело: это основная часть страницы, используемая для хранения данных.
Тело страницы дополнительно разделено на информационную область заголовка домашней страницы табличного пространства и область бизнес-данных. ЗАГОЛОВОК ФСП: (1): Информация о табличном пространстве: идентификатор соответствующего пространства, общее количество страниц в табличном пространстве и т. д. (2): Информация о сегменте: указатель связанного списка страницы, на которой находится объект сегмента, заполненный данными, и указатель связанного списка страницы, на которой расположен объект сегмента, не заполненный данными (указывающий на не объект сегмента, а страница, на которой находится объект сегмента, на одной странице хранится 85 объектов сегмента). (3): Информация о области/кластере фрагмента: свободная область/кластер фрагмента (сам объект XDES, а не страница, на которой расположен объект XEDS) указатель связанного списка, указатель связанного списка области неполного фрагмента и связанный список области заполненного фрагмента. Эта информация об области/кластере не принадлежит какому-либо сегменту, а принадлежит табличному пространству, которое используется для выделения пространства для сегмента в следующий раз.
Теоретически область/кластер будет полностью выделена для сегмента, но некоторые области/кластеры сразу после создания назначаются табличному пространству и используются как фрагментированные области. Чтобы сократить потери, только некоторые страницы в этих регионах выделяются определенному сегменту.
Например: Когда вы риторически заявляете, что собираетесь написать шедевр, и просите секретаря дать вам 500 страниц бумаги, секретарь, скорее всего, все просмотрел.С одной стороны, он ответит вам да, с другой с другой стороны, он даст вам только 3 страницы, потому что думает, что вы, вероятно, не сможете удержать 6 слов за 7 дней. Точно так же, когда innodb выделяет пространство для вновь созданного сегмента, он не выделяет область/кластер в начале, а выделяет 32 страницы из фрагментированной области.Только когда эти 32 страницы израсходованы, innodb считает этот сегмент большим. сегмент данных, таким образом официально начав выделять ему полный экстент/кластер.
Часть данных:
FSP HEADER указывает на связанный список сегментов и связанный список фрагментированных областей, но это только указатели связанных списков, а информационные узлы реальной области хранятся в области данных текущей страницы. Один информационный объект области/кластера называется одной записью XDES (eXtent DEScript); на одной странице хранится 256 записей XDES.
Запись XDES, как показано выше, содержит идентификатор сегмента (если он назначен сегменту), указатель следующего узла в связанном списке фрагментированных областей и т. д. Он не содержит информации о странице, так как область/кластер имеет соответствующее физическое пространство, а страница в его пространстве является собственной страницей, поэтому нет необходимости указывать ее в записи.
Внимательные друзья обнаружат, что, хотя запись XDES описывает область/кластер, она не указывает номер или адрес области/кластера, так какой же области/кластеру в физическом пространстве она соответствует?
Сами области/кластеры не нумеруются, но области/кластеры, как и страницы, располагаются последовательно, начиная с первого байта файла. При этом первой страницей первой области каждых 256 областей/кластеров является индексная страница этих 256 областей/кластеров, а именно страница XDES.
Страница XDES имеет номер страницы, поэтому можно вычислить адрес этой страницы XDES, то есть адреса всех областей/кластеров этой страницы. Следующие 255 областей/кластеров имеют соответствующую запись XDES, хранящуюся на странице XDES Смещения позиций этих записей XDES на этой странице являются смещениями следующих 255 областей/кластеров, начиная с текущей XDES кластер, соответствующий записи XDES, может быть рассчитан по всем позициям области/кластера на странице и соответствующим смещениям.
Страница FSP HDR похожа на титульную страницу табличного пространства и является страницей входа всего табличного пространства..
- XDES-страница: Страница XDES — это аббревиатура страницы описания области/кластера eXtent DEScript, которая используется для хранения информационных объектов области/кластера, то есть страницы, на которой хранится запись XDES. Он точно такой же, за исключением того, что он отличается от ЗАГОЛОВКА FSP на странице FSP. По сути, домашняя страница также является страницей XDES, но домашняя страница является первой страницей всего табличного пространства, поэтому она частично записывает информацию о табличном пространстве.
Запись XDES: логический блок, в котором хранится информация о самой зоне.
Поскольку страница XDES может хранить только 256 записей, соответствующих 256 областям, логически для каждых 256 областей требуется страница xdex для хранения информации о следующей серии из 256 областей.
- Страница ИНОД: Подобно входной информации, соответствующей области/кластеру, табличное пространство указывает только на связанный список страниц сегментов (несегментных сущностей) в различных состояниях, но не хранит саму информацию о сегментах. Страница индексного дескриптора — это страница, используемая для хранения записи индексного дескриптора, описывающей информацию о сегменте.
Страница inode хранит 85 объектов сегмента по умолчанию, и каждый объект указывает на связанный список области/кластера различных состояний, соответствующих этому сегменту: связанный список неиспользуемой области/кластера, связанный список полной области/кластера, незаполненный список области/кластера.
- Индексная страница Вышеуказанные страницы — это все страницы, на которых хранится состояние использования физического пространства и которые используются для управления областью/кластером и самим сегментом.Индексная страница используется для окончательного хранения бизнес-данных.. Табличные данные в innodb организованы и хранятся с помощью кластеризованного индекса, конечные узлы хранятся в одном сегменте, а неконечные узлы хранятся в другом сегменте, но в конечном итоге они будут храниться на страницах индексного типа.
Детали индексной страницы следующие:
Структура хранения индексной страницы следующая:Бизнес-данные на странице представляют собой односвязный список, организованный логически по порядку. На странице есть две виртуальные строки, которые представляют собой строку с наименьшим значением индекса и самую большую строку на всей странице, то есть первую строку и последнюю строку в связанном списке, которые используются для определения диапазона связанный список.
Кроме того, для индексного сегмента страница имеет около 16250 байт для хранения пользовательских данных. Строка содержит 4-байтовый ключ int, 6-байтовый номер страницы, указывающий на конечный узел, и 6-байтовый заголовок строки, всего около 16 байтов. Тогда при грубом расчете одна страница 16250/16 может хранить около 1000 записей. В целях оптимизации запроса каждые 4-8 строк данных хранятся в 2-байтовом пространстве, называемом слотом, и эти слоты вместе образуют массив, называемый каталогом страниц.
Как показано на рисунке: последний слот массива хранит первую строку инфимума, второй слот инвертированных данных хранит строку 4, а первый слот положительной последовательности хранит последнюю строку супремума данных. Таким образом, массив каталогов страниц представляет собой упорядоченный массив, который может быстро найти блок данных с помощью алгоритма двоичного поиска, а затем пройти блок, чтобы найти окончательные данные, соответствующие требованиям.
Уведомление: Так как между пользовательской строкой и концом страницы есть свободное пространство, а количество слотов не фиксируется количеством строк в странице, то есть длина массива справочника страниц не фиксирована, поэтому слоты выделяются путем добавления вперед в обратном порядке.
весь кадр
Выше приведена структура и информация о данных различных объектов в табличном пространстве Давайте посмотрим, как каждый компонент связан с общей точки зрения.
-
Микроскопически файл табличного пространства физически разделен на смежные страницы одинакового размера.
-
Макроскопически файлы табличных пространств физически разделены на большие, умноженные и непрерывные области/кластеры.
-
0-я страница 0-го файла называется FSP-страницей, то есть первой страницей, которую можно считать титульной страницей табличного пространства. Он хранит указатели связанных списков других компонентов всего табличного пространства и является страницей входа всего табличного пространства.
-
Логически страницы FSP указывают на разные компоненты через две строки. (1): Указание на информацию о сегменте через FSP_SEG_INODES_FULL (связанный список страниц полного сегмента) и FSP_SEG_INODES_FREE (связанный список страниц неполного сегмента). Объект сегмента указывает на область/кластер, принадлежащий этому сегменту, через FSEG_FREE (список свободных областей/кластеров), FSEG_FULL (полная область/кластер) и FSEG_NOT_FULL (незаполненная область/кластер). (2): FSP_FREE (список свободных областей/кластеров), FSP_FREE_FRAG (область/кластер незаполненных фрагментов), FSP_FULL_FRAG (область/кластер полных фрагментов) указывают на области/кластеры, которые не принадлежат ни к одному сегменту.
-
На первой странице первой области/кластера из каждых 256 областей/кластеров хранится информация управления 256 областями/кластерами. Страница 0 называется страницей FSP, потому что она особенная, а остальные страницы называются страницей XDES. По этому номеру страницы и хранящемуся в ней смещению позиции входа можно легко рассчитать расположение 256 экстентов на диске. Таким образом, даже если номер или адрес области/кластера не записаны в записи XDES, вы можете знать, какой областью/кластером управляет каждая запись.
-
При вставке фрагмента данных на страницу индекса, если страница заполнена, необходимо обратиться за пространством к области/кластеру, где расположена страница.Если область/кластер также заполнена, применить к сегменту, где она находится Если сегмент также заполнен, он будет применен к табличному пространству, а табличное пространство будет применено к 3 областям/кластерам на диске через операционную систему и добавит их в связанный список FSP_FREE в FSP. Затем он выделяется уровень за уровнем и сохраняется в соответствующем связанном списке.
Ряд/Ряд
Все представленные выше объекты предназначены для выделения части физического пространства для хранения бизнес-данных, и, наконец, бизнес-данные могут быть записаны на указанной странице. А innodb основан на хранении строк, давайте просто взглянем на структуру хранения компактного формата строк.
Каждая запись содержит ряд сведений заголовка, описывающих состояние хранения текущей записи, как показано на рисунке. Но в дополнение к информации заголовка, хранящиеся данные различаются в зависимости от узла, на котором находится запись.
-
Конечный узел агрегированного индекса записывает бизнес-строки в таблице.Помимо самих данных строки, он также включает идентификатор транзакции, указатель сегмента отката и скрытый row_id, если первичный ключ и уникальный индекс не указаны.
-
Неконечный узел предназначен для поиска по дереву B+, поэтому записывается минимальное значение записи дочернего узла и номер страницы дочернего узла.
Связь между узлами дерева B+ и страницами
Страница Innodb — это просто физическое пространство для хранения, эквивалентное странице книги, и является только носителем данных. Узлы дерева B+ представляют собой логические структуры данных, и теоретически между ними нет необходимой связи. Полное B+-дерево может храниться на одной странице страницы, или полное B+-дерево может храниться вместе с несколькими страницами, и даже страницы могут находиться во взаимно-однозначном соответствии с узлами в B+-дереве.
На самом деле, чтобы добиться простоты в Innodb, узлы дерева B+ и страницы страницы находятся во взаимно-однозначном соответствии Ниже приведен простой процесс расширения.
Предположим, что имеется кластеризованное индексное дерево B+, которое начинается так:
Вставьте три строки данных 16, 17 и 18 в дерево B+ следующим образом (зеленая часть):
Продолжайте вставлять 19 строк данных в дерево B+ Исходное пространство заполнено и расширено следующим образом (синяя часть):
Если в кластерном индексе используется автоматически увеличивающийся первичный ключ, данные сохраняются на каждой странице дополнительным образом.Если страница заполнена, для продолжения добавления необходимо только перераспределить пространство страницы.
Если в кластеризованном индексе используется неупорядоченный столбец, такой как uuid, поскольку B+ является логически упорядоченным набором, вставка данных в дерево B+, скорее всего, будет вставлена в исходную полную страницу, что приведет к разделению исходных страниц. Перемещается как вставка данных в массив, чтобы освободить место для новых данных. Поэтому рекомендуется использовать упорядоченный столбец в качестве кластеризованного индекса.
Как сохранить часть данных шаг за шагом
После многих трудностей я наконец могу вставить часть данных от начала до конца и изучить, как innodb хранит данные в файлах шаг за шагом. Младшие сестры, вероятно, очарованы услышанным, и они счастливы думать об этом Я действительно умное маленькое привидение.
Потягиваясь, мило глядя на сестер.
Эй, а как же люди? Я пересекаю равное пространство?
Забудь, хорошо начни и хорошо закончи, скажу я себе, я не могу запутать других, и я до сих пор не верю, что не могу запутать себя.
- Создать пользователя таблицы в мире базы данных
CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(10) DEFAULT NULL,
age int(11) DEFAULT NULL,
gender smallint(6) DEFAULT NULL,
create_time date DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
innodb хранит информацию о структуре таблицы в таблицах и столбцах библиотеки information_schema системного табличного пространства.
- Создать табличное пространство В то же время создайте независимое табличное пространство world/user и соответствующий файл данных world/user.ibd и обновите их до information_schema.innodb_tablespaces.
Синхронно обновить информацию о файле, соответствующую табличному пространству, до information_schema.files.
Предусмотрено, что файл №0 табличного пространства, то есть страница №0 файла world/user.ibd, является титульной страницей табличного пространства.
- Создать кластеризованный индекс Если указан первичный ключ или уникальный индекс, используйте указанный столбец для создания кластеризованного индекса, в противном случае используйте скрытый столбец row_id для создания кластеризованного индекса и сохранения его в information_schema.innodb_indexes.
Создайте два сегмента для индекса: сегмент индекса (неконечный узел) и сегмент данных (конечный узел), и сохраните информацию о сегментах в списке сегментов на титульной странице табличного пространства.
Создайте первую страницу для индекса, корневую страницу, и запишите информацию о сегментах в связанный список сегментов корневой страницы, чтобы управлять информацией о сегментах этого дерева B+. При этом запишите Root PageNo в information_schema.innodb_indexes, как показано на рисунке выше. Корневая страница связывает логическую таблицу с физическим хранилищем, и эта корневая страница эквивалентна обложке индекса.
- вставить данные Вставьте часть данных в таблицу следующим образом
insert into world.user(name,age,gender,create_time) values('木叶潇潇',18,1,now())
Извлеките имя базы данных и имя таблицы из sql и узнайте идентификатор таблицы из information_schema.innodb_tables.
В соответствии с идентификатором таблицы номер корневой страницы кластеризованного индекса, соответствующего таблице, равен 4 из information_schema.innodb_indexes.
Вычислите физический адрес от корневой страницы до корневой страницы № 4. В соответствии с информацией о сегменте, указанной на корневой странице, вставьте данные индекса в корневую страницу, вставьте строки данных в страницу, соответствующую сегменту данных, и свяжите два типа страниц.
Если места на странице недостаточно, область/кластер, в котором находится текущая страница, будет рассчитана и применена для пространства.Область/кластер запросит свободную страницу в соответствии с растровым изображением в записи XDES и выделит ее. Если в области/кластере нет свободного места, оно будет применяться для требуемого пространства к вышеуказанному сегменту, табличному пространству и операционной системе.
Применяемое табличное пространство будет сохранено в соответствующем связанном списке (например, пространство, запрошенное табличным пространством, будет сохранено в соответствующем связанном списке FSP_FREE).
Когда страница выделяется или расширяется, чтобы гарантировать, что ее можно будет найти через номер корневой страницы в innodb_indexes, физическое пространство корневой страницы и корневой узел, соответствующий дереву B+, остаются неизменными, то есть номер страницы остается неизменным. , и это всегда тот, у которого номер страницы 4. пробел.
Когда физическая страница, соответствующая B+, постоянно изменяется, для обеспечения баланса дерева будет создан новый корневой узел.Чтобы сохранить корневую страницу неизменной, innodb копирует данные нового корневого узла в исходный корневой узел. Page путем обмена .page, чтобы можно было гарантировать, что корневая страница никогда не изменится, то есть чтобы гарантировать, что связь между таблицей и физическим пространством никогда не будет разорвана.
Суммировать
- Табличное пространство — это логическая структура в базе данных, которая разделяет связь таблиц, индексов и т. д. с файлами.
- Сегмент также представляет собой логическую структуру, которая группирует данные с одинаковым конкретным логическим значением и одинаковой структурой хранения в группу для удобства управления.
- Зона — это физическая структура хранения, соответствующая реальному физическому пространству на большом диске. Он делится на одинаковый размер, начиная с первого байта файла, и логически объединяет экстенты через XDES Entry. Отношения между записью XDES и областью физического пространства, которой она управляет, можно рассчитать с помощью страницы, на которой расположена запись XDES, и смещения внутри страницы.
- Страница — это наименьшая единица операций ввода-вывода физического хранилища. Он также делится на одинаковый размер, начиная с первого байта файла. Таблица упорядочивает данные по индексу, а номер корневой страницы пары таблиц хранится в метаданных кластеризованного индекса. Страницы пронумерованы, и они могут быть связаны с физическими пространствами через числа.
Сегменты и области используются для управления состоянием хранения пространства и для выделения места для страниц. Реальному запросу нужно только передать отношение ассоциации между номером страницы и всеми уровнями узлов в дереве B+ для обработки данных в физическом пространстве страницы. весь стол.
- Строка — это физическая единица, в которой в конечном счете хранятся бизнес-данные. Значение по умолчанию — 16 КБ на страницу, которая может хранить около 1000 строк данных индекса (неконечные узлы) или 20 или более строк бизнес-данных (конечные узлы). Алгоритм «двоичного поиска (предполагая несколько точек)» дерева B+ используется для быстрого поиска данных между страницами, а несколько строк группируются в группы через каталог страниц, и одна группа соответствует слоту в упорядоченном массиве. Каталог страниц, чтобы можно было выполнить оптимизацию «бинарного поиска» на странице.
Для записи состояния самой строки запись innodb добавляет дополнительную информацию о заголовке записи. Если это конечный узел, будут добавлены дополнительные поля, такие как row_id (скрытый первичный ключ), trx_id (идентификатор транзакции) и указатель отката.
Я Ао Бин,Чем больше вы знаете, тем больше вы не знаете, спасибо за ваши таланты:как,собиратьиКомментарий, увидимся в следующий раз!
Статья постоянно обновляется, вы можете искать в WeChat "Третий принц Ао Бин"Прочтите это в первый раз, ответьте [материал] Подготовленные мной материалы интервью и шаблоны резюме крупных заводов первой линии, эта статьяGitHub github.com/JavaFamilyОн был включен, и есть полные тестовые сайты для интервью с крупными заводами.Добро пожаловать в Star.