Почему созданный вами индекс БД не вступил в силу, условия инвалидации индекса!

база данных

Почти все друзья могут невзначай сказать несколько слов о преимуществах и недостатках создания индекса, а также знают, когда создавать индекс для повышения производительности наших запросов, и когда индекс будет обновляться, но замечали ли вы, что даже если вы установить индекс, иногда индекс не вступает в силу! Это не только проверяет понимание индекса всеми, но также позволяет всем правильно использовать его при его использовании. Ниже описаны некоторые особые ситуации, которые могут привести к сбою индекса. Надеюсь, вы обратите на это внимание во время обычной разработки и собеседований!

1. Как определить, действует ли индекс базы данных

Прежде всего, прежде чем перейти к обсуждению, поговорим о том, как судить о том, действует ли индекс БД! Я считаю, что все должны были догадаться, то есть объяснить! Объяснение показывает, как MySQL использует индексы для обработки операторов выбора и объединения таблиц. Он может помочь выбрать лучшие индексы и написать более оптимизированные запросы.

Например, у нас есть пользователь таблицы, создайте индекс name_index для столбца name следующим образом:

这里写图片描述
Используйте объяснение, чтобы проанализировать утверждение следующим образом:
这里写图片描述
Как видите, с помощью объяснения отображается много столбцов, и значение каждого ключевого слова следующее:

  • таблица: как следует из названия, о какой таблице данные в этой строке;

  • тип: это важный столбец, показывающий, какой тип соединения используется. отот лучшего к худшемуТипы соединений: const, eq_reg, ref, range, indexhe и ALL;

  • возможных_ключей: отображает индексы, которые можно применить к этой таблице. Если пусто, нет возможных индексов. Соответствующий оператор может быть выбран из оператора where для соответствующего домена;

  • ключ: Фактический используемый индекс. Если NULL, индекс не используется. В редких случаях MySQL выберет недостаточно оптимизированный индекс. В этом случае вы можете использовать USE INDEX(имя_индекса) в операторе Select, чтобы принудительно использовать индекс, или IGNORE INDEX(имя_индекса), чтобы заставить MySQL игнорировать индекс;

  • key_len: длина используемого индекса. Чем короче длина, тем лучше без потери точности;

  • ref: показывает, какой столбец индекса используется, если возможно, константа;

  • rows: количество строк, которые, по мнению MySQL, должны быть проверены, чтобы вернуть запрошенные данные;

  • Дополнительно: дополнительная информация о том, как MySQL анализирует запрос.

Конкретные значения и значения, которые может представлять каждый столбец, см. в официальной документации MySQL по адресу:Dev.MySQL.com/doc/Furious/…

2. При каких сценариях индекс вступит в силу?

1. Старайтесь избегать использования оператора != или в предложении where, иначе движок откажется от использования индекса и выполнит полное сканирование таблицы;

这里写图片描述

2. Старайтесь избегать использования или в предложении where для подключения условий, иначе движок откажется от использования индекса и выполнит полное сканирование таблицы, даже если есть условный индекс, он не будет использован, поэтому используйте или как можно меньше;

这里写图片描述

3. Для многоколоночного индекса, если это не первая часть использования, индекс не будет использоваться;

4. Если тип столбца — строка, обязательно заключайте данные в условие в кавычки, иначе индекс не будет использоваться;

这里写图片描述

5. Нечеткий запрос типа начинается с %, а индекс недействителен;

这里写图片描述

6, надо попробоватьизбегатьПоля в предложении whereманипулирование выражениями, что заставит движок отказаться от использования индекса и выполнить полное сканирование таблицы;

Такие как:

select id from t where num/2 = 100 

Следует изменить на:

select id from t where num = 100*2;

7, надо попробоватьизбегатьПоля в предложении whereработа функции, что заставит движок отказаться от использования индекса и выполнить полное сканирование таблицы;

Например:

select id from t where substring(name,1,3) = 'abc' – name;

Начинающиеся с abc следует изменить на:

select id from t where name like ‘abc%’ 

Например:

select id from t where datediff(day, createdate, '2005-11-30') = 0 – '2005-11-30';

Следует изменить на:

select id from t where createdate >= '2005-11-30' and createdate < '2005-12-1';

8. Не выполняйте функции, арифметические операции или другие операции с выражениями слева от "=" в предложении where, иначе система не сможет правильно использовать индекс;

9. Если MySQL считает, что использование полного сканирования таблицы быстрее, чем использование индекса, не используйте индекс;

10. Не подходит для столбцов с меньшим количеством ключевых значений (столбцы с большим количеством повторяющихся данных)

Если столбец индекса TYPE имеет 5 ключевых значений, если имеется 10 000 фрагментов данных, то WHERE TYPE = 1 обеспечит доступ к 2 000 блоков данных в таблице. В дополнение к доступу к индексным блокам необходимо получить доступ к более чем 200 блокам данных. Если используется полное сканирование таблицы, предполагая, что 10 фрагментов данных представляют собой один блок данных, то необходимо получить доступ только к блокам данных 1000. Поскольку полное сканирование таблицы обращается к меньшему количеству блоков данных, индекс определенно не будет использоваться.


Справочная статья:

1,blog.CSDN.net/QQ_33774822… Дотроньтесь до своего носа. Очистите и съешьте. Можете/дотронуться до своего носа_PNG/U…

在这里插入图片描述

[Преимущества видео] Бесплатное обучающее видео 2T, найдите или отсканируйте приведенный выше QR-код, чтобы подписаться на общедоступную учетную запись WeChat: Java Backend Technology (ID: JavaITWork) Ответ:1024, вы можете получить его бесплатно! Содержит бесплатные обучающие видео по SSM, Spring Family Bucket, Microservices, MySQL, MyCat, Cluster, Distributed, Middleware, Linux, Network, Multithreading, Jenkins, Nexus, Docker, ELK и т. д., которые постоянно обновляются!