Mysql
 sql >> база данни >  >> RDS >> Mysql

Mysql подзаявката винаги извършва сортиране на файлове

Използване на 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 изглежда много по-добре:

<предварителен код>| ID | изберете_тип | маса | тип | възможни_ключове | ключ | key_len | препратка | редове | Допълнително ||----|--------------------|-------|-------|----- ----------|---------|---------|------------------- ---------|------|--------------------------|| 1 | ОСНОВЕН | приложение | индекс | ОСНОВЕН | ОСНОВЕН | 4 | (нула) | 2 | Използване на къде; Използване на индекс || 1 | ОСНОВЕН | gp | препратка | id_app | id_app | 5 | db_2_034bc.app.id,const | 1 | Използване на къде; Използване на индекс || 2 | ЗАВИСИМА ПОДЗАЯВКА | smgp | препратка | id_app | id_app | 5 | db_2_034bc.gp.id_app,const | 1 | Използване на индекс |

Друг начин да го пренапишете е следният:

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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв е еквивалентът на DATALENGTH() в MySQL?

  2. Прехвърляне от VARCHAR към INT - MySQL

  3. TIMESTAMPADD() Примери – MySQL

  4. Дълбока JSON заявка с частичен път в MySQL 5.7?

  5. Как да изпълните програмно КОГА и ТОГАВА при актуализация на MySQL с помощта на Python и Django?