0

説明

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(...)を整数に置き換えると、主キーが使用されていることが示され、クエリが高速になります。関数を使用すると、主キーが使用されておらず、クエリが遅いことがわかります。30EXPLAINEXPLAIN

質問

この結合でこの関数の結果を使用するときに、関数を使用して 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...)
4

1 に答える 1

0

私の場合、このアプローチでは達成したかったことは不可能でした。

于 2012-02-15T02:43:41.893 に答える