全部: 我有一個表格來記錄一些維度每10分鐘一些請求的數量。這是我的表格:mysql插入vs更新性能
CREATE TABLE IF NOT EXISTS `mydb`.`realtime_bid_traffic` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '',
`owner_id` BIGINT(20) NOT NULL COMMENT '',
`log_time` DATETIME NOT NULL COMMENT '',
`bid_num` BIGINT(10) NOT NULL DEFAULT 0 COMMENT '',
`v_bid_num` BIGINT(10) NOT NULL DEFAULT 0 COMMENT '',
PRIMARY KEY (`id`) COMMENT '',
UNIQUE INDEX `dim_key` USING BTREE (`owner_id` ASC, `log_time` ASC) COMMENT '')
ENGINE = InnoDB;
正如你所看到的,id是一個沒有任何特殊含義的自動增量大整數。 owner_id
和log_time
是尺寸鍵,而bid_num
和v_bid_num
是要更新的內容。受商業邏輯限制,我無法在插入數據庫之前收集所有數據,即我可能必須插入數據庫,其中owner_id=10
和log_time='2015-11-11 11:00:00'
兩次。由於表可能相當大(數百萬行)並需要不斷更新,因此我有兩種選擇:
- 插入或更新重複鍵。通過這種方式,每個維 將只有一行,但它涉及更新,併爲了 提高性能我已經建立了owner_id和 log_time的唯一鍵。
- 只需插入。在這種情況下,我將刪除 owner_id和log_time的唯一密鑰,並將其插入到數據庫中。由於id是 主鍵,它永遠不會重複,但它可能會顯着增加錶行 。
我不知道從性能角度看哪個更好。
「在幾乎所有情況下,插入新行比檢查重複和插入/更新的方法快。」 - 如果check-for-duplicates導致對非idexed字段進行更新,這可能不會像性能方面那麼糟糕,因爲索引不需要更新,就像插入時那樣。 – JimmyB
@HannoBinder。 。 。這是一個好點;但是,僅插入方法不需要該索引。由於其他原因,這可能是可取的,但插入不需要。 –