Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик-аккаунт, просьба указывать источник перепечатываемой статьи.
Честно говоря, знания, связанные с индексированием базы данных, очень сложны. Я хотел хорошенько рассмотреть этот аспект, а затем написать статью, чтобы рассказать об этом подробно. Позже я обнаружил, что знания об индексировании слишком сложны и слишком глубоко, и необходимо говорить об этом всесторонне.Это действительно сложно описать подробно, поэтому в конце я все же превращаю то, что я узнал и думал, в следующие вопросы, надеясь помочь всем!
Точка знаний
Вопрос 1: Что такое индекс базы данных?
Индекс базы данных является важной концепцией в системе баз данных, индекс также называетсяkey
, представляет собой структуру данных, используемую для повышения эффективности запросов к базе данных. Мы можем понимать индекс как каталог книги. С помощью каталога мы можем быстро найти содержание соответствующей главы. Точно так же с помощью индекса базы данных мы можем быстро найти данные в таблице соответствующей записи.
В целом, индекс подобен созданию каталога для таблицы данных.
Вопрос 2: Почему используются индексы?
1. Использование индексов значительно уменьшает объем данных, которые необходимо сканировать подсистеме хранения.Если индексы не используются, таблица данных должна сканироваться для каждой запрашиваемой строки данных, что будет очень медленным.
2. Поскольку индекс уже отсортирован, выполнитеORDER BY
иGROUP BY
Дождавшись операции, можно быстро получить результат.
3. Индекс может быть случайнымI/O
преобразован в последовательныйI/O
, чтобы избежать дорогих дисковIO
затраты и повысить эффективность запросов.
Вопрос 3: В каком модуле реализован индекс MySQL?
MySQL
Индекс реализуется на уровне механизма хранения, поэтому каждый механизм хранения имеет разные методы реализации, и методы обработки одного и того же индекса также различаются.
Вопрос 4: Почему индекс установлен, но не работает?
При использовании с%
началоLIKE
Если оператор выполняет нечеткое сопоставление, индекс нельзя использовать, например:
SELECT * FROM users WHERE name LIKE '%小张%';
SELECT * FROM users WHERE name LIKE '%小张';
Но с%
В конце вы можете использовать индекс, например:
SELECT * FROM users WHERE name LIKE '张%';
OR
Индекс не используется до и после оператора, такого как следующий оператор,字段id
имеет индекс и字段name
Без создания индекса следующий оператор может выполнять только полное сканирование таблицы и не может использовать индекс:
SELECT * FROM users id = 10 or name='test'
Вопрос 5: Какую структуру данных использует базовый индекс MySQL?
существуетMySQL
В большинстве случаев используется индексB-Tree
В качестве базовой структуры данныхB-Tree
Просто общий термин, на самом деле разные механизмы хранения используютB-Tree
, есть разные варианты, напримерInnoDB
используетB+Tree
.
Кроме того, существуют также некоторые специальные индексные структуры, такие как хэш-индекс.Нижний уровень хэш-индекса использует хеш-таблицу.MySQL
, ТолькоMemory
Механизм хранения поддерживает хэш-индексы.
Вопрос 6: В каких случаях таблица данных не подходит для создания индексов?
1. Для таблиц данных, которые используются для хранения архивных исторических данных и редко используются для запросов, не рекомендуется создавать индексы.
2. Таблицы данных с относительно небольшим объемом данных и данные, которые не будут слишком сильно расти в будущем, не должны индексироваться, например таблицы данных, используемые для сохранения конфигураций.
3. Когда модификация выполняется часто и производительность модификации намного превышает производительность запроса, индекс не следует создавать повторно.
Вопрос 7: Что такое форма возврата?
Таблица возврата предназначена для механизма хранения Innodb, вInnoDB
В подсистеме хранения конечные узлы индекса первичного ключа хранят данные записей, а конечные узлы обычного индекса хранят расположение индекса первичного ключа.
Когда мы запрашиваем по первичному ключу, нам нужно только выполнить поиск в дереве поиска по индексу первичного ключа, и мы можем напрямую получить записанные данные.
Когда мы запрашиваем обычный индекс, после того как мы получаем адрес первичного ключа путем поиска в дереве поиска обычного индекса, нам нужно использовать первичный ключ для поиска в дереве поиска первичного ключа.Этот процесс называется таблицей возврата.
Вопрос 8. В чем разница между кластеризованным индексом и некластеризованным индексом?
Кластеризованный индекс: порядок кластеризованного индекса — это физический порядок хранения данных, а индекс и данные размещаются вместе, и данные могут быть получены непосредственно через индекс.В таблице данных есть только один кластеризованный индекс.
Некластеризованный индекс: порядок индекса не зависит от порядка физического расположения данных, а файл индекса и данные хранятся отдельно.
Вопрос 9: В чем разница между индексом первичного ключа MySQL, уникальным индексом и обычным индексом?
Поля, установленные как индексы первичного ключа, не могут бытьNULL
, а таблица данных может иметь только один индекс первичного ключа.
Поле, заданное как уникальный индекс, значение поля которого не может быть значительным.
Обычный индекс может содержать повторяющиеся значения или может бытьNULL
.
Вопрос 10. Индексы могут повысить производительность запросов. Означает ли это, что чем больше индексов вы создадите, тем лучше?
В качестве каталога таблицы данных хранение самого индекса занимает много места на диске и в памяти.
Также помогает то, что при записи данных в таблицу данных индекс нужно каждый раз обновлять, поэтому чем больше индексов, тем медленнее запись.
Особенно плохие индексы, чем больше вы строите, тем больше влияние на производительность базы данных.
Вопрос 11: В чем разница между MyISAM и InnoDB в обработке индексов?
MyISAM
Механизм хранения представляет собой некластеризованный индекс, индекс и данные хранятся отдельно, а указатель данных записывается в файл индекса.
иInnoDB
Механизм хранения представляет собой кластеризованный индекс, то есть индекс и данные размещаются вместе.InnoDB
Как правило, первичный ключ и данные объединяются. Если первичный ключ отсутствует,unique key
в качестве первичного ключа, если нетunique key
, он автоматически создаетrowid
В качестве первичного ключа другие конечные указатели вторичного индекса хранят местоположение первичного ключа.
Вопрос 12: Каков принцип крайнего левого префикса для индексов?
MySQL
База данных может не только создать индекс для одного столбца данных, но также создать совместный индекс для нескольких столбцов данных, например:
CREATE TABLE test(
a INT NOT NOT,
b INT NOT NOT,
KEY(a,b)
);
Когда мы используем следующий оператор запроса, из-заWHERE
Условием запроса в операторе является совместный индекс, поэтому данные могут быть запрошены быстро.
SELECT * FROM test WHERE a=1 AND b=1;
Аналогично, следующий оператор будет использовать индекс объединения, созданный выше, потому чтоMySQL
Он будет отсортирован в том порядке, в котором был создан индекс, а затем на основе условий запроса с крайней левой стороны индекса, чтобы проверить, удовлетворяют ли условия запроса индексу, поскольку полеa
В крайнем левом углу, так что удовлетворите индекс.
SELECT * FROM test WHERE a=1;
при использовании字段b
При запросе он удовлетворяется, потому что самое левое совпадение字段a
,такMySQL
Делается вывод, что условие индекса не выполнено.
SELECT * FROM test WHERE b=1;
Приведенный выше пример дает хорошее понимание принципа крайнего левого префикса индекса, а также иллюстрирует важность порядка индекса.
Вопрос 13: Что такое индекс покрытия?
Если индекс содержит поля, необходимые для запроса, и нет необходимости возвращаться к таблице для выполнения запроса в это время, мы называем этот индекс покрывающим индексом.
Например, в следующем запросе идентификатор поля является индексом первичного ключа, поэтому значение индекса может быть возвращено напрямую, что значительно повышает производительность запроса.
SELECT id FROM users WHERE id BETWEEN 10 AND 20;
резюме
Конечно, приведенный выше список — это лишь малая часть пунктов знаний индекса, если есть какой-то неправильный ответ, пожалуйста, укажите.
Если вы считаете, что статья хороша, отсканируйте код, чтобы следовать ему. Ваше внимание — самая большая мотивация для моего письма.