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

D
На сайте с 28.06.2008
Offline
1101
229

Тестирую сложный запрос, вроде уже добился времени выполнения в 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 не заставляют использовать индекс

IL
На сайте с 20.04.2007
Offline
435
#1
Dram:
что не так?

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

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

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

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

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
D
На сайте с 28.06.2008
Offline
1101
#2

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

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

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

368,7000,6238,5977

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

danforth
На сайте с 18.12.2015
Offline
153
#3

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

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

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

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

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

Junior Web Developer

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий