Описание
Я пытаюсь JOIN
таблица, используя результат сохраненной функции. Хранимая функция возвращает целое число без знака, которое совпадает с типом поля, к которому я присоединяюсь.
Задача
Поле, к которому я пытаюсь JOIN
, является первичным ключом. Моя проблема в том, что MySQL здесь не использует первичный ключ.
Соответствующие строки запроса (показанные ниже):
LEFT JOIN second_db.s
ON s.id = first_db.find_spend_id(qi.other_type, qi.other_id)
Если я заменю свой вызов функции first_db.find_spend_id(...)
на целое число, например 30
, EXPLAIN
показывает, что используется первичный ключ, и запрос выполняется быстро. Если я использую свою функцию, EXPLAIN
показывает, что первичный ключ не используется, а запрос медленный.
Вопрос
Есть ли способ использовать мою функцию и , чтобы MySQL использовал первичный ключ при использовании результата этой функции в этом соединении? Как мне изменить мой код, чтобы достичь этого самого великолепного разрешения?
Информация
Запрос
EXPLAIN SELECT *
FROM first_db.qhr
JOIN first_db.qi
ON qi.id = qhr.issue_id
AND qhr.status = 'Accepted'
LEFT JOIN second_db.s
ON s.id = first_db.find_spend_id(qi.other_type, qi.other_id)
JOIN second_db.spend_reports AS sr
ON sr.id = s.spend_report_id
JOIN first_db.companies AS b
ON b.id = s.member_id
JOIN first_db.brands
ON brands.id = sr.brand_id
LIMIT 0, 10
Функция
CREATE DEFINER=`user`@`%` FUNCTION `find_spend_id`(lookup_other_type ENUM('One', 'Two'), lookup_other_id INT(10))
RETURNS int(10)
READS SQL DATA
BEGIN
(...snip actual code...)
return 30;
END
Объясните
id select_type table type possible_keys key key_len ref rows Extra
(...snip...)
1 SIMPLE s ALL NULL NULL NULL NULL 5999 "Using join buffer"
(...snip...)