Mysql

如何為插入大量並僅查詢最新數據的 MySQL 表建立索引

  • November 2, 2016

我有一個使用 InnoDB 的 MySQL 數據庫表,如下所示:

OrgID (INTEGER)
MachID (INTEGER)
Date (DATETIME)
IdleTime (INTEGER)

我在這張桌子上做了兩個操作:

  1. 插入一條新記錄,包含 Org ID、Mach ID、Date 和 IdleTime
  2. 查詢給定的組織/機器 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

引用自:https://dba.stackexchange.com/questions/153942