要有包含事件的表,有以下欄目: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