要有包含事件的表,有以下栏目:MySQL的性能加入上表本身
- 事件ID(整数)
- 型(整数)
- 时间戳(UNIX之一)
- itemId(整数)
- userPrimaryId(如果不存在,则为NULL - 整数)
- userSecondaryId(始终存在 - 字符串) 个
- 数据(包含各种其他信息)
现在,让我们也定义事件2型和事件型1.
的问题是找到2类型的所有事件:
- 在类型1的事件表(我们称之为验证事件)内有
- ,它们在时间范围内n表单类型2(即验证事件小于事件2,但不小于n从时间戳n)
- 事件2和验证活动必须的itemId的验证的数据字段匹配,并且(userPrimaryId如果没有这个不为空,否则就secondaryId)
并返回数据域这样的事件,再加上行(这很重要)。
真正的问题是这样做的快速查询,因为存在两个事件类型2和类型1.
一对夫妇十万行,我们对事件ID(主键)的索引,类型,和时间戳字段。
这里就是我的立场:
SELECT
*
FROM
(
SELECT
*
FROM Event
WHERE type=2
AND Time BETWEEN ${from} AND ${to}
) b
INNER JOIN
(
SELECT
*
FROM Event
WHERE type=1
AND Time BETWEEN (${from}-1000 AND ${to}
) c ON b.ItemId=c.ItemId
AND ((b.UserId IS NOT NULL AND b.UserId=c.UserId) OR c.CookieId=b.CookieId)
我目前的做法是在两个单独的查询选择两个事件类型,内部加入他们的行列。
现在我的问题是如何只保留具有最大时间戳的那一行,如果我通过eventId对类型2元素进行分组。
任何优秀的解决方案,或更快的查询执行的替代方法? (上加入大约需要100秒来执行,这已经是显著)
对于你的倒数第二段,你的意思是用'ItemId'或'eventId'分组吗?每个'eventId'只能有一个'timestamp',所以我找不到每个'eventId'的最大时间戳。此外,'UserId'与'userPrimaryId'相同,'CookieId'与'userSecondaryId'相同?列出的列与示例查询中的列不同。 – 2014-11-26 20:49:30