gpt4 book ai didi

mysql插入与更新性能

转载 作者:行者123 更新时间:2023-11-29 02:53:02 25 4
gpt4 key购买 nike

全部:我有一个表格,每十分钟记录一些维度上的一些请求的数量。这是我的表格:

    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_idlog_time 是维度键,bid_numv_bid_num 是要更新的内容。受业务逻辑的限制,我不可能在插入数据库之前收集所有数据,即我可能必须插入 owner_id=10log_time='2015-11-11 11 的数据库:00:00' 两次。由于表格可能非常大(数百万行)并且需要不断更新,我有两个选择:

  1. 插入或更新重复键。这样对于每个维度只有一行,但它涉及更新,以便提高性能我已经为 owner_id 和日志时间。
  2. 只需插入。在这种情况下,我将删除唯一键owner_id 和 log_time 并插入到数据库中。由于 id 是主键它永远不会重复,但它可能会增加表行显着。

从性能的角度来看,我不知道哪个更好。

最佳答案

评论有点长。

如果您关心插入到表中,那么第二个选项通常更快。在大多数情况下,插入新行比检查重复项和插入/更新方法更快。即使 table 变得非常大,这仍然是正确的。只要索引适合内存,这将保持正确。

但是,数据通常还有其他用途,而不仅仅是放入表格中。对于许多查询目的,没有重复项可能会极大地帮助查询。如果您通过 user_id/log_time(如索引所建议的那样)进行查询,那么在查询端处理重复项应该是微不足道的——两行对一行具有最小的impact 和 order by id desc limit 1 在两行上占用的资源非常少。

(嗯,我想有一个边缘情况,插入到一个有数十亿行的表中,一个索引会比插入到一个有 10 行的表中检查重复项慢,因为索引更新会慢于检查重复项查询。但是,您的用例与这种情况相去甚远,因为您只谈论每行 2 个重复项。)

关于mysql插入与更新性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33692058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com