MySQL JOIN не использует первичный ключ при присоединении к результату, возвращенному из функции - PullRequest
0 голосов
/ 28 сентября 2011

Описание

Я пытаюсь 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...)

1 Ответ

0 голосов
/ 15 февраля 2012

В моем случае то, чего я хотел достичь, было невозможно при таком подходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...