使用左联接和联接表中的order by时,MySQL查询花费的时间太长
我有一个非常快速的查询(大约0.2862秒): 所以我需要这个查询来使用左联接和联接表中的order by时,MySQL查询花费的时间太长,mysql,sql,Mysql,Sql,我有一个非常快速的查询(大约0.2862秒): 所以我需要这个查询来orderbyskinuto 因此,我修改了上述查询以实现此目的: SELECT title, godina, (SELECT zanrovi.zanr FROM zanrovi WHERE filmovi.zanr=zanrovi.id ) AS zanr, imdb, ocjena, sd, hd, fhd, 3d, (SELECT CO
orderbyskinuto
因此,我修改了上述查询以实现此目的:
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(电影)
zanrovi
的外部连接。您正在子查询中使用它,因此这是可疑的
如果没有什么作用,请考虑< <代码> > 子句中的更多筛选。由于外部查询中的
JOIN
,似乎没有必要使用zanr
的子查询:
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
中,subselect和join的用法不清楚。。更新您的问题添加适当的数据样本和预期结果。您是否使用EXPLAIN
查看哪些部分耗时最长,哪些索引可用等?如果没有,请运行它并将结果添加到您的问题中。另外,可能是您正在使用的表的表定义,以便我们可以看到您有哪些索引。它的工作原理就像使用您的代码应该非常快一样。谢谢
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;