如何為插入大量並僅查詢最新數據的 MySQL 表建立索引
我有一個使用 InnoDB 的 MySQL 數據庫表,如下所示:
OrgID (INTEGER) MachID (INTEGER) Date (DATETIME) IdleTime (INTEGER)
我在這張桌子上做了兩個操作:
- 插入一條新記錄,包含 Org ID、Mach ID、Date 和 IdleTime
- 查詢給定的組織/機器 ID 對,最後一天的 IdleTime 總和:
SELECT SUM(IdleTime) FROM DBTable WHERE OrgID=1 AND MachID=2 AND Date BETWEEN 'YYYY-mm-dd 00:00:00' AND 'YYYY-mm-dd 23:59:59';
我們可能希望獲得給定 OrgID 的總 IdleTime 總和,但這只是額外的獎勵。在大多數情況下, YYYY-mm-dd 是昨天。
我們更關心
INSERT
操作的性能,但我們不想太慢SELECT
。我的老闆建議添加一個新列作為主鍵,即類似INSERT_TIME(TIMESTAMP)
,以確保插入是順序的。我想知道是否使用PRIMARY KEY (OrgID, MachID, Date)
可能有幫助。關於如何使用索引來提高性能的任何建議?
PRIMARY KEY (OrgID, MachID, Date)
對那個查詢有好處。 但是, aPRIMARY KEY
必然是“唯一的”;這種組合是獨一無二的嗎?如果不是唯一的,則將其設為普通文件INDEX
並使用其他內容作為PRIMARY KEY
.如果我們每天談論數百萬行,那麼匯總表將是值得的。
如果通常是“昨天”,那麼考慮:
AND Date >= CURDATE() - INTERVAL 1 DAY AND Date < CURDATE()
或者,更一般地說,(您在幾天前插入“?”的位置):
AND Date >= CURDATE() - INTERVAL ? DAY AND Date < CURDATE() - INTERVAL ?-1 DAY
更多的
確保順序 - 不是那麼重要。使用該 3 部分 PK,您將在幾個位置按順序插入,即
OrgID
和的每個組合MachID
。
Insert
確實需要更新輔助鍵,但這通常沒什麼大不了的。(要獲得真正的技術性,請參閱“InnoDB 的更改緩衝”。)如果您要每秒插入超過 100 行*,*那麼我建議將它們收集起來並批量插入。另請參閱
innodb_flush_log_at_trx_commit = 2
。