我有一个非常快速的查询(大约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/