MySQL 子查询与 LIMIT 与 JOIN

Posted

技术标签:

【中文标题】MySQL 子查询与 LIMIT 与 JOIN【英文标题】:MySQL Subquery With LIMIT vs JOIN 【发布时间】:2012-08-06 19:17:38 【问题描述】:

我更愿意为此使用 JOIN,但由于性能影响,没有一个解决方案是可行的,或者它们不会返回正确的结果集。

RunTime 列是每晚午夜捕获的 UNIX 时间戳。并非每个条目都会在每晚出现,这意味着 Entry1 的条目可能在两天前出现,但不是今天。

架构:

 `ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(32) NOT NULL,
  `Category` int(11) NOT NULL,
  `RunTime` int(11) NOT NULL,
  UNIQUE KEY `ID` (`ID`),

期望结果示例:

+-------------+----------------+----------+
| Name        | LastRunTime        | Count    |
+-------------+----------------+----------+
| Random Name |     1339131600 |       73 |
| RandomName2 |     1337131600 |       13 |
... etc

基本上,我的工作查询如下所示。它将查询表以获取昨天的数据。

select Name,
       RunTime AS LastRunTime,
       count(*) AS Count
from TABLE
where RunTime = 
    (
    select DISTINCT( RunTime ) from TABLE WHERE r.Name=Name order by RunTime LIMIT 1,1
    ) 
and Category in 
    (
    select AnotherTable .ID from AnotherTable where AnotherTable.Status = 1
    )

group by Name

问题是,这个查询很慢。我想从RunTime 列上的第一个子查询移开,但是限制和关联对我来说是最好的。以上需要非常、非常、很长时间。

有没有人举例说明以下方法:

RunTime 在所有行中不一致的情况下,快速有效地获取第二个最近的RunTime、第二个最近的RunTime 的行数?

欢迎提出任何建议!

【问题讨论】:

您的索引是什么样的?前面带有EXPLAIN 的查询和子查询运行的结果是什么。 【参考方案1】:
    Select Name, Max(RunTime ) as  LastRunTime        ,Count(*) as Count
    from TABLE a
    Inner join AnotherTable b ON a.Category =b.ID and   b.Status = 1
    GROUP BY name
    Having LastRunTime < Max(RunTime )

【讨论】:

你为什么要两次MAX(RunTime)?在您的Having 中,您可以说HAVING RunTime &lt; LastRunTime @arnoudhgz,你需要 MAX(),因为它只能与某种比较函数一起使用,否则你应该只使用 where。 现在,在您上次编辑时,查询无法获得结果。你现在是说只有比自己小的东西的结果才能在结果中......(LastRuntime 是相同的MAX(RunTime),所以LastRunTim &lt; MAX(RunTime) 会给你 0 个结果) @sixeightzero LastRunTime 不是表格列。 HAVING RunTime &lt; LastRunTime 应该可以解决这个查询 @arnoudhgz,我在使用运行时时找不到列。如果我通过 LastRunTime,则有工作,但它会提取不是当前运行时的所有记录。【参考方案2】:

我坚持使用子查询,但将时间范围更改为 WHERE RunTime = (SELECT MAX(RunTime) - 86400...

要求太高或太复杂的所有其他解决方案或尝试。

【讨论】:

以上是关于MySQL 子查询与 LIMIT 与 JOIN的主要内容,如果未能解决你的问题,请参考以下文章

子查询与关联查询区别

mysql子查询

MySQL - 优化查询(LIMIT、OFFSET、JOIN)> 2500 万行

MySQL--5子查询与连接小结

mysql优化总结

MySQL里面的子查询