【发布时间】: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的查询和子查询运行的结果是什么。
标签: mysql query-optimization subquery percona xtradb