我有一个非常快速的查询(大约0.2862秒):

SELECT title, godina,
       (SELECT zanrovi.zanr
        FROM zanrovi
        WHERE filmovi.zanr=zanrovi.id
       ) AS zanr,
       imdb, ocjena, sd, hd, fhd, 3d ,
       (SELECT COUNT(film)
        FROM statistika
        WHERE film=filmovi.id
       ) AS skinuto
FROM filmovi LEFT JOIN
     zanrovi
     ON filmovi.podzanrovi=zanrovi.id
ORDER BY filmovi.id DESC
LIMIT 0, 32

所以我需要这个查询ORDER BY skinuto
所以我修改了上面的查询:
SELECT title, godina,
       (SELECT zanrovi.zanr
        FROM zanrovi
        WHERE filmovi.zanr=zanrovi.id
       ) AS zanr,
       imdb, ocjena, sd, hd, fhd, 3d,
       (SELECT COUNT(film)
        FROM statistika
        WHERE film=filmovi.id
       ) AS skinuto
FROM filmovi LEFT JOIN
     zanrovi
     ON filmovi.podzanrovi=zanrovi.id
ORDER BY skinuto DESC
LIMIT 0, 32

查询在41.328秒内执行!?所以这太长了…所以我看到如果我从另一个表中使用skinuto,会有延迟,所以问题是如何按skinuto排序,以便查询能够按应有的速度执行?
当我删除skinuto的订单并替换为filmovi.id的订单时,它执行得非常快(低于0.5秒),我需要skinuto的订单。我在密码里漏掉了什么?
谢谢。

最佳答案

首先,在引用多个表的查询中,应始终使用完全限定的列名。子查询应该如下所示:

. . .
       (SELECT COUNT(s.film)
        FROM statistika s
        WHERE s.film = f.id
       ) AS skinuto
FROM filmovi f LEFT JOIN
     zanrovi z
     ON f.podzanrovi = z.id

这使得查询更容易理解。
你可能没有办法提高成绩。但首先要从以下索引开始:
zanrovi(id, zanr)
statistika(film)
这将加快子查询的速度。
我还想知道是否需要到zanrovi的外部连接。您正在子查询中使用它,因此这是可疑的。
如果这没有多大作用,请考虑在FROM子句中进行更多筛选。由于外部查询中的zanr,似乎不需要JOIN的子查询:
SELECT title, godina, z.zanr,
       imdb, ocjena, sd, hd, fhd, 3d ,
       s.skinuto
FROM (SELECT s.film, COUNT(s.film) as skinuto
      FROM statistika s
      GROUP BY s.film
      ORDER BY skinuto DESC
      LIMIT 0, 32
     ) s LEFT JOIN
     filmovi f
     ON s.film = f.id LEFT JOIN
     zanrovi z
     ON f.podzanrovi = z.id
ORDER BY s.skinuto DESC;

这假设statistika中的所有胶片都在filmovi中。

关于mysql - 使用左联接和从联接表排序时,MySQL Query花费的时间太长,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52458433/

10-13 22:14