Ускорьте Mysql Query, используя функцию разделения - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь ускорить запрос MYSQL. В столбце с именем «MISC» мне сначала нужно извлечь переменную «traceID», которая будет использоваться для сопоставления строки другой таблицы. Пример столбца MISC:

PFFCC_Strip/fkk49322/PMethod=Diners/CardType=Diners/9999******9999/2010/TraceId=7122910

Я извлекаю значение "7122910" в качестве traceID и нахожу соответствующую строку с левым соединением. Значение traceId уникально, в каждой таблице должна присутствовать только одна строка.

Я не могу установить индекс в таблицах для ускорения процесса. Любой подход, который мог бы заставить этот запрос работать быстрее? На самом деле, запуск занимает несколько секунд, что невозможно.

select *
from
(select TraceID,PP,UDef2, Payment_Method, Approved, TransactionID, Amount
from pr) pr
left join 
(select 
 PAYMENT_ID as Payment_ID_omega, TRANSACTION_TYPE, 
 REQUESTED_AMOUNT, AMOUNT, `STATUS` as StatusRef_omega,
 REQUEST_DATE, Agent,
 if (locate('TraceId=',MISC)>0, SUBSTRING_INDEX(MISC,'TraceId=',-1),'') as traceID
from BankingActivity ) omega
on pr.TraceID = omega.traceID
having
(REQUEST_DATE BETWEEN DATE_ADD(DATE(NOW()), INTERVAL -1 DAY) AND NOW())
ORDER BY pr.TraceID DESC

1 Ответ

0 голосов
/ 15 октября 2019

Вы можете разместить фильтры внутри запроса перед объединением, что должно иметь значение, и у вас должен быть индекс для таблицы pr (TraceID) и BankingActivity (REQUEST_DATE, traceID). Для более оптимизированного запроса, пожалуйста, опубликуйте план выполнения.

select * from(select TraceID
                    ,PP
                    ,UDef2
                    ,Payment_Method
                    ,Approved
                    ,TransactionID
                    ,Amount
               from pr) pr
left join (select PAYMENT_ID as Payment_ID_omega
                 ,TRANSACTION_TYPE
                 ,REQUESTED_AMOUNT
                 ,AMOUNT
                 ,`STATUS` as StatusRef_omega
                 ,REQUEST_DATE
                 ,Agent
                 ,if (locate('TraceId=', MISC) > 0, SUBSTRING_INDEX(MISC,'TraceId=',-1),'') as traceID 
           from BankingActivity
           WHERE REQUEST_DATE BETWEEN DATE_ADD(DATE(NOW()), INTERVAL -1 DAY) AND NOW()) omega
on pr.TraceID = omega.traceID
ORDER BY pr.TraceID DESC
...