Почему не срабатывает индекс при sql запросе?

Ссылка скопирована
1 ответ

Здравствуйте.

Имеется сайт на 1с-Битрикс. С БД MariaDB 10.6.7

Некоторое время назад начали появляться медленные запросы на бою. Установили что проблема в том что не используется индекс при получении значений таблицы.

К примеру выполнили запрос через EXPLAIN на тесте, тут все хорошо:

Почему не срабатывает индекс при sql запросе?

Но если тот же запрос выполнить на бою, то индекс не используется, хотя ключи имеются:

Почему не срабатывает индекс при sql запросе?

В чем может быть причина такого поведения?

Дополнительно:

Вопросы о производительности либо использовании индексов без полных CREATE TABLE всех таблиц, точного текста запроса и сведений о статистике данных - бессмысленны.

Если Вы убеждены, что использование индекса будет эффективно - то всегда есть FORCE INDEX. Хотя начинать надо с ANALYZE TABLE.

  • Было такое в постгресе: на тесте индекс ОК, на проде - не используется.
    Как оказалось - не была собрана статистика по таблице.

    Не знаю как это работает с MySQL/MariaDB, но в целом согласен с Akina

  • Михаил,

    Не знаю как это работает с MySQL/MariaDB

    Да прекрасно работает. ANALYZE TABLE обновляет статистику, и индекс снова используется, если это имеет смысл.

  • Слишком низкая селективность индекса. Оптимизатор решил, что полное сканирование таблицы выгоднее, чем использование индекса.

    • Там действительно низкая селективность, запрос получает все товары каталога.
      Но на тесе с индексом быстрее.

      Дело в том, что база одна (на тесте только менее актуальная давно не обновляли) а сервера разные.
      Есть подозрение, что что-то накрутили в настройках сервера боевого и он теперь не верно принимает решение не использовать индекс.
      Так как один и тот же запрос приведенный выше на тесте с использованием индекса выполняется 0,2 сек, а на бою без индекса 14 сек.
      А какими настройками это правится?

    • Ilia Malashko, Это настройками не правится. Оптимизатор сам решает, когда имеет смысл использовать индекс. Для MySQL/MariaDB лимит проходит где-то по 1/COUNT(DISTINCT) = 20±5%.
      Можно попробовать построить более селективный индекс по набору полей, но надо анализировать запрос.
    • Rsa97, обновил базу на тестовом сервере.
      Ситуация не изменилась, на боевом не используется индекс и подтягивается 215029 записей:
      type - ALL possible_keys - PRIMARY,ix_iblock_element_1,ix_iblock_element_4,ix_iblock_element_3,ix_iblock_element_code,ix_perf_b_iblock_element_1,ixbp_iblock_element_id	 key - {пусто} key_len - {пусто} ref - {пусто} rows - 215029

      type - ALL possible_keys - PRIMARY,ix_iblock_element_1,ix_iblock_element_4,ix_iblock_element_3,ix_iblock_element_code,ix_perf_b_iblock_element_1,ixbp_iblock_element_id key - {пусто} key_len - {пусто} ref - {пусто} rows - 215029

      На тесте сейчас та же база и тот же запрос, и он уже отдает 116024 записей и из индекса

      type - ref possible_keys - PRIMARY,ix_iblock_element_1,ix_iblock_element_4,ix_iblock_element_3,ix_iblock_element_code,ix_perf_b_iblock_element_1,ixbp_iblock_element_id		 key - ix_iblock_element_1	 key_len - 4 ref - const rows - 116024

      type - ref possible_keys - PRIMARY,ix_iblock_element_1,ix_iblock_element_4,ix_iblock_element_3,ix_iblock_element_code,ix_perf_b_iblock_element_1,ixbp_iblock_element_id key - ix_iblock_element_1 key_len - 4 ref - const rows - 116024

      То есть значит все таки оптимизатор работает по разному? Так как отличие только на уровне сервера.

    • Ilia Malashko, Тоже может быть. Внутренние оптимизаторы СУБД - дело тёмное и их работа может зависеть от погоды на Марсе. Может влиять версия сервера, наличие свободной оперативной памяти, фрагментация таблицы и индексов, возможность параллельной обработки, накопленная за время работы СУБД статистика по таблице и многое другое.
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Мария Код Ответ

    Возможно, проблема с отсутствием срабатывания индекса при SQL запросе может быть вызвана несколькими причинами. Вот несколько возможных причин и способы их решения:

    1. Отсутствие индекса на поле, по которому вы осуществляете поиск в запросе. Убедитесь, что у соответствующего поля в вашей таблице есть индекс. Если индекс отсутствует, создайте его с помощью следующего SQL запроса:

    CREATE INDEX index_name ON TABLE_NAME (column_name);

    CREATE INDEX index_name ON table_name (column_name);

    2. Использование неправильного типа индекса. В зависимости от запроса и типа данных, может потребоваться использовать различные типы индексов, такие как обычные индексы, уникальные индексы или полнотекстовые индексы. Убедитесь, что вы выбрали правильный тип индекса для вашего случая.

    3. Устаревшие статистические данные. Иногда база данных может иметь устаревшие статистические данные, что может привести к неправильному выбору плана выполнения запроса и игнорированию индексов. Попробуйте обновить статистику базы данных с помощью команды ANALYZE:

    ANALYZE TABLE_NAME;

    ANALYZE table_name;

    4. Слишком малое количество данных. Если таблица содержит слишком мало записей, оптимизатор запросов может принять решение не использовать индекс. В таком случае, попробуйте добавить больше данных для тестирования срабатывания индекса.

    5. Неправильно составлен запрос. Проверьте ваш SQL запрос на наличие ошибок и оптимизируйте его, если это необходимо. Иногда неправильно составленные запросы могут привести к игнорированию индексов.

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

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно