Използване на filesort
не е непременно нещо лошо. Името е малко подвеждащо. Въпреки че съдържа "файл", това не означава, че данните са записани навсякъде на твърдия диск. Все още само се обработва в паметта.
От ръководство :
Разбирате защо това се случва във вашето запитване, нали? Използването на този вид подзаявки е лош стил, тъй като е зависим подзаявка. За всеки ред във вашето приложение
таблица подзаявката се изпълнява. Много лошо. Пренапишете заявката с join
.
изберете app.id,gp.dateupfrom приложение се присъедини към gamesplatform_pricehistory gp на gp.id_app =app.idwhere app.id> 0 и gp.country =1и gp.dateup =(SELECT MAX(dateup) FROM gamesplatform_pricehistory smgp WHERE smgp.id_app =gp.id_app И smgp.country =1);
Това все още използва зависима подзаявка, но explain
изглежда много по-добре:
Друг начин да го пренапишете е следният:
select app.id,gp.dateupfrom app LEFT join (SELECT id_app, MAX(dateup) AS dateup FROM gamesplatform_pricehistory WHERE country =1 GROUP BY id_app)gp on gp.id_app =app.idwhere app.id> 0;
Обяснението изглежда още по-добре:
<предварителен код>| ID | изберете_тип | маса | тип | възможни_ключове | ключ | key_len | препратка | редове | Допълнително ||----|-------------|----------------------- |-------|-------|---------|---------|----- ---|------|--------------------------|| 1 | ОСНОВЕН | приложение | индекс | ОСНОВЕН | ОСНОВЕН | 4 | (нула) | 2 | Използване на къде; Използване на индекс || 1 | ОСНОВЕН | <изведен2> | ВСИЧКИ | (нула) | (нула) | (нула) | (нула) | 2 | || 2 | ПРОИЗВОДНО | gamesplatform_pricehistory | индекс | (нула) | id_app | 13 | (нула) | 2 | Използване на къде; Използване на индекс |И ето версия, в която изобщо нямате зависима подзаявка:
изберете app.id,gp.dateupот приложението ляво присъединяване към gamesplatform_pricehistory gp на gp.id_app =app.id и държава =1left присъединяване към gamesplatform_pricehistory gp2 към gp.id_app =app.id и държава =1 и gp.dateup 0 и gp2.dateup е null;
Работи по следния начин:Когато gp.dateup
е на максимум, няма gp2.dateup
.