mysql插入与更新性能
全部: 我有一个表格,每十分钟记录一些维度上的请求数。这是我的桌子:mysql插入与更新性能,mysql,sql,database-performance,Mysql,Sql,Database Performance,全部: 我有一个表格,每十分钟记录一些维度上的请求数。这是我的桌子: 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
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\u id
和log\u time
是维度键,bid\u num
和v\u bid\u num
是要更新的。受业务逻辑的限制,我不可能在插入数据库之前收集所有数据,也就是说,我可能必须在owner\u id=10
和log\u time='2015-11-11 11:00:00'的数据库中插入两次。由于表可能相当大(数百万行),需要不断更新,因此我有两个选项:
插入或更新重复密钥。以这种方式为每个维度
只有一行,但它涉及更新和
提高性能我为所有者id和
记录时间李>
只需插入。在这种情况下,我将删除的唯一密钥
所有者id和日志时间,然后插入数据库。因为id是
主键永远不会重复,但它可能会增加表行数
意义重大
从性能的角度来看,我不知道哪一个更好。这是一个有点长的评论
如果您只关心插入到表中,那么第二个选项通常更快。在大多数情况下,插入新行比检查重复项和插入/更新方法要快。即使桌子越来越大,这仍然是事实。只要索引适合内存,这将保持不变
然而,数据通常有其他用途,而不仅仅是放在表中。对于许多查询目的,没有重复项可能会大大有助于查询。如果您是通过user\u id
/log\u time
(如索引所示)进行查询,那么在查询端处理重复项应该很简单——两行对一行的影响最小,order by id desc limit 1
在两行上占用很少的资源
(嗯,我假设存在一种边缘情况,在检查重复项时,插入到一个具有数十亿行索引的表中要比插入到一个具有10行的表中慢,因为索引更新要比检查重复项查询慢。但是,您的用例离这种情况足够远,因为您需要e每行仅讨论两个副本。)计划A
PRIMARY KEY(id),
UNIQUE(owner_id, log_time)
每次插入都必须检查两个键的DUP;这会减慢插入速度
方案B
PRIMARY KEY(id),
INDEX(owner_id, log_time)
这要求您的选择代码执行某种类型的分组和聚合
方案C
PRIMARY KEY(owner_id, log_time)
而且没有id
。无论如何,为什么您有id
?虽然计划A和B总是插入到表“末尾”的数据中(因为自动增量
),但计划C将有多个“热点”,每个所有者id一个。这没问题
计划D
INDEX(id),
PRIMARY KEY(owner_id, log_time)
如果计划C不可接受,则计划D允许您保留id
。否,自动增量
不必是主键
。需要IODKU
哪个?
除了计划B之外,其他都需要IODKU(在重复密钥更新时插入)。但我不认为这是一个严重的缺点
计划C和D可能会提高选择的性能,特别是当您由一个所有者id选择时
我更喜欢按以下顺序排列的计划:C、D、B、A。您可以根据您可以/不能接受的约束来选择。“在几乎所有情况下,插入新行比检查重复项和插入/更新方法更快。”--如果检查重复项会导致对非idex字段进行更新,这可能不会像插入时那样导致性能下降,因为索引不需要更新。@HannoBinder…这是一个很好的观点;但是,仅插入方法不需要索引。这可能是出于其他原因,但不是n为插页设计了一个新的工具。