Оператор SQL загружается очень медленно с Order By - PullRequest
0 голосов
/ 12 января 2019

У меня есть этот SQL-оператор ниже и возвращает в 0,149 секунд:

SELECT Trans.Transid, TransDetail.TransDetailID FROM Trans  
LEFT JOIN TransDetail ON Trans.Reference = TransDetail.TransID 
LIMIT 1000

Я изменил, добавив Order By, и он сильно замедляет возврат до 1 минуты 20 секунд

SELECT Trans.Transid, TransDetail.TransDetailID FROM Trans  
LEFT JOIN TransDetail ON Trans.Reference = TransDetail.TransID 
ORDER BY Trans.Transid, TransDetail.TransDetailID 
LIMIT 1000

Это то, что я сделал, но все еще не улучшил скорость:

1.) Добавлен индекс для Trans.TransID, Trans.Reference и TransDetail.TransDetailID

2.) Попытка установить предел равным 1, но все равно возвращается очень медленно

3.) Пробовал делать ORDER BY Trans.Transid и он возвращается через 0,223 секунды

4.) Попытался выполнить ORDER BY TransDetail.TransDetailID, и он возвращается через 48,365 секунд

Выполнение TransDetail.TrasnsDetailID только в Order by выполняется медленнее, чем Trans.TransID. Но выполнение обоих делает это очень очень медленно.

Какой лучший способ сделать заказ, чтобы сделать его быстрее?

1 Ответ

0 голосов
/ 12 января 2019

Предлагаю использовать 2 ограничения.
Сначала на самом маленьком и быстром столе.
Затем по результату левого соединения.

SELECT tr.Transid, det.TransDetailID 
FROM 
(
    SELECT Transid, Reference
    FROM Trans
    ORDER BY Transid
    LIMIT 1000
 ) tr
LEFT JOIN TransDetail det ON det.TransID = tr.Reference
ORDER BY tr.Transid, det.TransDetailID 
LIMIT 1000

Было бы полезно получить индекс Trans.TransID для подзапроса.
Но я предполагаю, что TransID является первичным ключом в этой таблице в любом случае.

И это также выиграет от индекса TransDetail.TransID.
Чтобы ускорить объединение на TransDetail.

Небольшой тест здесь

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