mysql - 查询运行时间太长

标签 mysql sql

我正在运行以下查询,以根据同一表中的日期字段检索唯一的最新结果。但是当表在增长时,这个查询会花费太多时间。欢迎提出任何改进建议。

select
    t2.*
from
    (
        select
            (
                select
                    id
                from
                    ctc_pre_assets ti
                where
                    ti.ctcassettag = t1.ctcassettag
                order by
                    ti.createddate desc limit 1
            ) lid
        from
            (
                select
                    distinct ctcassettag
                from
                    ctc_pre_assets
            ) t1
    ) ro,
    ctc_pre_assets t2
where
    t2.id = ro.lid
order by
    id

我们的 able 可能多次包含同一行,但每一行都有不同的时间戳。我的对象基于单个列,例如 assettag 我想为每个具有最新时间戳的 assettag 检索单行。

最佳答案

找到每个 ctcassettag 的最新日期,然后返回以找到匹配的整行,这更简单,而且可能更快。

这确实假定没有 ctcassettag 有多行具有相同的 createddate,在这种情况下,您可以每个返回不止一行ctcassettag.

SELECT
    ctc_pre_assets.*
FROM
    ctc_pre_assets
INNER JOIN
(
    SELECT
        ctcassettag,
        MAX(createddate)   AS createddate
    FROM
        ctc_pre_assets
    GROUP BY
        ctcassettag
)
   newest
       ON  newest.ctcassettag = ctc_pre_assets.ctcassettag
       AND newest.createddate = ctc_pre_assets.createddate
ORDER BY
    ctc_pre_assets.id

编辑:处理具有相同日期的多行。

如果在同一 createddate 上有多个行用于同一 ctcassettag,您实际上还没有说明如何选择您想要的行。因此,此解决方案只是从那些 duplicates 中选择具有最低 id 的行。

SELECT
    ctc_pre_assets.*
FROM
    ctc_pre_assets
WHERE
    ctc_pre_assets.id
    =
    (
        SELECT
            lookup.id
        FROM
            ctc_pre_assets   lookup
        WHERE
            lookup.ctcassettag = ctc_pre_assets.ctcassettag
        ORDER BY
            lookup.createddate  DESC,
            lookup.id           ASC
        LIMIT
            1
    )

这仍然使用相关子查询,它比简单的嵌套子查询慢(例如我的第一个答案),但它确实处理与“重复”。

您可以通过更改相关子查询中的 ORDER BY 来更改选择行的规则。

它也与您自己的查询非常相似,但少了一个连接。

关于mysql - 查询运行时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40525660/

相关文章:

mysql - 批量 SQL 更新将整个数据库中的某些短语更改为新短语

MYSQL FULLTEXT 搜索无法正常工作

php - 预编译语句查询不返回任何结果

sql - 如何在 SQL 中请求随机行?

php - 使用 CodeIgniter 从 mysql 数据库中随机记录

php - 子选择或子查询

php - 使用 GROUP SEPARATOR 的 Explode() 函数

mysql - 使用UPDATE函数批量更新记录

sql - 根据时间差合并记录?

mysql - 使用日期格式的 INSERT ... SELECT