這感覺就像是「爲我做我的作業」類問題,但我真的堅持在這裏試圖使這個查詢快速運行在許多行的表上。 Here's a SQLFiddle顯示模式(或多或少)。爲數億行的表優化查詢
我玩過索引,試圖找到能夠顯示所有需要的列的東西,但沒有取得太大的成功。這裏的create
:
CREATE TABLE `AuditEvent` (
`auditEventId` bigint(20) NOT NULL AUTO_INCREMENT,
`eventTime` datetime NOT NULL,
`target1Id` int(11) DEFAULT NULL,
`target1Name` varchar(100) DEFAULT NULL,
`target2Id` int(11) DEFAULT NULL,
`target2Name` varchar(100) DEFAULT NULL,
`clientId` int(11) NOT NULL DEFAULT '1',
`type` int(11) not null,
PRIMARY KEY (`auditEventId`),
KEY `Transactions` (`clientId`,`eventTime`,`target1Id`,`type`),
KEY `TransactionsJoin` (`auditEventId`, `clientId`,`eventTime`,`target1Id`,`type`)
)
和(A版)的select
:
select ae.target1Id, ae.type, count(*)
from AuditEvent ae
where ae.clientId=4
and (ae.eventTime between '2011-09-01 03:00:00' and '2012-09-30 23:57:00')
group by ae.target1Id, ae.type;
我結束了一個 '臨時使用' 和 '使用文件排序' 爲好。我嘗試刪除count(*)
並使用select distinct
代替,這不會導致'使用filesort'。如果有辦法返回join
以獲得計數,這可能會沒問題。
最初決定跟蹤目標的target1Name和target2Name,因爲它們在創建審計記錄時存在。我也需要這些名字(最近會做)。
目前查詢(上面,缺少target1Name和target2Name列)在約2400萬條記錄中運行約5秒鐘。我們的目標是數以億計,我們希望查詢能夠繼續沿着這些方向發展(希望能夠保持在1-2分鐘之內,但我們希望更好),但是我的恐懼是一次我們擊中了大量的數據(不會模擬額外的行)。
我不確定獲得額外字段的最佳策略。如果我將這些列直接添加到select
中,我會在查詢中失去「使用索引」。我嘗試了一個join
回到表格,它保持'使用索引',但需要大約20秒。
我曾嘗試將eventTime列更改爲int而不是日期時間,但似乎並未影響索引使用或時間。
什麼是您當前查詢時間和你有什麼瞭解下「很快」? – feeela
對不起,添加那些細節 –
你有clientId和eventTime的索引嗎?另外,請確認您是否有那些使用eventTime索引並且沒有進行全表掃描。 –