Тестирую сложный запрос, вроде уже добился времени выполнения в 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 поднять выше, я так понимаю логики запроса он не изменит.
Dram
Тестирую сложный запрос, вроде уже добился времени выполнения в 0,01 сек.
Но по t1 идет перебор 4831 строк и не используется индекс. Хоу подсказать ему использовать индекс, но получаю ошибку синтаксиса.
что не так?
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 ———-
Вот так ошибка пропала
test_bo_items AS t1
FORCE INDEX (mk_code)
Но ни FORCE ни USE не заставляют использовать индекс
ivan-lev
что не так?
С большой вероятностью MySQL сам подберёт нужный индекс, если он существует.
(есть ли индекс t1.mk_code?
В указанном запросе в первом JOIN-е уже задействовано поле из этой таблицы
t1.section_id и если t1.mk_code индекс по одному полю mk_code, то в данном случае он не применим.
Dram
А может тип поля сменить?
У меня сейчас поле mk_code -varchar(100)
Данные там хранятся так —
Больше 30 символов в поле нет
danforth
Dram, хинты для индексов используйте после FROM.
Вместо INNER JOIN можно использовать STRAIGHT_JOIN.
Попробуйте INNER JOIN поднять выше, я так понимаю логики запроса он не изменит.
Составной индекс на id, mk_code есть?
Где EXPLAIN и структура таблиц?