説明
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...)