FORCE INDEX не могу вставить


Dram
224

Тестирую сложный запрос, вроде уже добился времени выполнения в 0,01 сек.

Но по t1 идет перебор 4831 строк и не используется индекс. Хоу подсказать ему использовать индекс, но получаю ошибку синтаксиса.

что не так?

SELECT t1.heading,
CONCAT(‘/katalog/’,
t2.id,
‘-‘,
t2.alias,
‘/’,
t1.id,
‘-‘,
t1.alias) as url
FROM
test_bo_items AS t1
LEFT JOIN
test_bo_sections AS t2 ON t1.section_id = t2.id
INNER JOIN
test_mk AS t3 on t3.id= t1.mk_code

FORCE INDEX (t1.mk_code)
WHERE t3.id in (247,250,251,196,943,288,944)

———- Добавлено 07.04.2020 в 11:09 ———-

Вот так ошибка пропала

FROM
test_bo_items AS t1
FORCE INDEX (mk_code)

Но ни FORCE ни USE не заставляют использовать индекс


ivan-lev

Dram:
что не так?

С большой вероятностью MySQL сам подберёт нужный индекс, если он существует.

(есть ли индекс t1.mk_code?

В указанном запросе в первом JOIN-е уже задействовано поле из этой таблицы

t1.section_id и если t1.mk_code индекс по одному полю mk_code, то в данном случае он не применим.


Dram

А может тип поля сменить?

У меня сейчас поле mk_code -varchar(100)

Данные там хранятся так —

368,7000,6238,5977

Больше 30 символов в поле нет


danforth

Dram, хинты для индексов используйте после FROM.

Вместо INNER JOIN можно использовать STRAIGHT_JOIN.

Попробуйте INNER JOIN поднять выше, я так понимаю логики запроса он не изменит.

Составной индекс на id, mk_code есть?

Где EXPLAIN и структура таблиц?

Добавить комментарий

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