Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql插入与更新性能_Mysql_Sql_Database Performance - Fatal编程技术网

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为插页设计了一个新的工具。