使用左联接和联接表中的order by时,MySQL查询花费的时间太长

使用左联接和联接表中的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

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