MySQL LEFT JOIN 只有最后一行非常慢

标签 mysql

我有三个表,看起来像这样

堡垒

|id|lat|lon|

fort_sightings

|id|fort_id|team|

堡垒突袭

|id|fort_id|raid_level|

我需要一个从 forts 中获取所有行的查询然后从fort_sightings中选择最新的信息和 fort_raids , 如果有的话。 fort_id 可能有几行具有相同的值,所以我需要最新的信息。

目前,我有这个,可能不是最漂亮的

SELECT
    *
FROM
    forts c

LEFT JOIN fort_sightings o ON o.id = (
    SELECT
        id
    FROM
        fort_sightings
    WHERE
        fort_id = c.id
    ORDER BY
        id DESC
    LIMIT 1
)

LEFT JOIN fort_raids r ON r.id = (
    SELECT
        id
    FROM
        fort_raids
    WHERE
        fort_id = c.id
    ORDER BY
        id DESC
    LIMIT 1
)

但是速度慢得令人痛苦,查询需要 10 多秒。 forts 中只有约 350 行,所以真的不应该花这么长时间。我相信它来自所有 SELECT JOIN 中的查询,但我不知道还有什么选择。

EXPLAIN explain query

最佳答案

这是您的查询:

SELECT *
FROM forts c LEFT JOIN
     fort_sightings o
     ON o.id = (SELECT fs2.id
                FROM fort_sightings fs2
                WHERE fs.fort_id = c.id
                ORDER BY fs2.id DESC
                LIMIT 1
               ) LEFT JOIN 
     fort_raids r
     ON r.id = (SELECT fr2.id
                FROM fort_raids fr2
                WHERE fr2.fort_id = c.id
                ORDER BY fr2.id DESC
                LIMIT 1
               );

我发现它的结构很奇怪。但是,看看这是否有效:

  • fort_sightings(fort_id, id)
  • fort_raids(fort_id, id)

重要的是 fort_id 是索引中的第一个键。

如果这不起作用,那么您可能需要修改查询。

关于MySQL LEFT JOIN 只有最后一行非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44762805/

相关文章:

c# - ADO.NET 需要 >5 秒才能以 ASP.NET 形式打开 MySql 连接

具有匹配列名的 PHP mySQL JOIN

MySQL 子查询计数与日历表缓慢

mysql - GROUP BY WITH HAVING ( DISTINCT ) : PHP , MYSQL

mysql - 连接一列并有一堆其他列的 SQL 查询?

mysql - 按时间戳对所有联合结果进行排序

java - 如何使用 Spring、Hibernate、MySQL ISAM 进行事务处理?

c++ - SOCI 外部符号未解析 "struct soci::mysql_backend_factory const soci::mysql"

mysql - 如何使用日期范围在perl上循环mysql查询

MySQL 触发器。如何在有限的时间内存储表中的每一行数据?