Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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
频繁更新单个表,而不是使用另一个表和CRON将更改导入MySQL中的主表?_Mysql_Database Design - Fatal编程技术网

频繁更新单个表,而不是使用另一个表和CRON将更改导入MySQL中的主表?

频繁更新单个表,而不是使用另一个表和CRON将更改导入MySQL中的主表?,mysql,database-design,Mysql,Database Design,我有一个带有登录日志的表,它非常繁忙,并且是一个很大的InnoDB表。始终插入新行,该表由系统的其他部分查询,它是数据库中最繁忙的表。在这个表中,有一个logid,它是主键,由软件以随机散列的形式生成(不是自动递增ID)。我还想存储一些数据,如查看的项目数 create table loginlogs ( logid bigint unsigned primary key, some_data varchar(255),

我有一个带有登录日志的表,它非常繁忙,并且是一个很大的InnoDB表。始终插入新行,该表由系统的其他部分查询,它是数据库中最繁忙的表。在这个表中,有一个
logid
,它是
主键
,由软件以随机散列的形式生成(不是自动递增ID)。我还想存储一些数据,如查看的项目数

create table loginlogs
(
    logid             bigint unsigned        primary key,
    some_data         varchar(255),
    viewed_items      biging unsigned
)
viewed_items是一个经常更新多行的值(假设每秒更新数千次)。我现在面临的困境是:

我应该吗

UPDATE loginlogs SET viewed_items = XXXX WHERE logid = YYYYY
还是我应该创造

create table loginlogs_viewed_items
(
    logid             bigint unsigned        primary key,
    viewed_items      biging unsigned,
    exported          tinyint unsigned default 0
)
然后使用CRON执行

UPDATE loginlogs_viewed_items t
  INNER JOIN loginlogs l ON l.logid = t.logid
SET
  t.exported = 1,
  l.viewed_items = t.viewed_items
WHERE
  t.exported = 0;
e、 每小时

请注意,无论哪种方式,对于一个logid,viewed_items计数器都会被更新多次,它甚至可以是100/hour/logid,并且有大量的行。因此,无论我为此选择哪个表,无论是主表还是单独的表,它都会得到非常频繁的更新


我希望避免对loginlogs表进行不必要的锁定,同时我不希望通过复制另一个表中的数据来降低性能。

Hmm,我想知道为什么您希望更改日志项,而不仅仅是添加新的日志项

但无论如何,正如你所说的,无论是单独更新还是批量更新,都必须进行

如果批量更新窗口的繁忙时间较短,则可能具有优势。否则,批量更新在运行时可能会产生更大的影响,而单独的更新可能会与其他操作更多地“交叉”,从而使影响变得不那么“明显”

如果您需要更新的列不是一直需要的,您可以考虑为该列单独设置一个表。这样,只需要其他列的查询可能不会受到更新的影响。

“成吨的行”——对某些人来说,这是“数百万”。对其他人来说,即使是“数十亿”也不是很大。请提供一些数字;答案可能不同。同时,这里有一些一般原则

我假设该表是
ENGINE=InnoDB

  • 一次更新一行的成本是一次更新100行的10倍
  • 更新一条语句中超过1000行是有问题的。它将锁定每一行,可能导致其他语句的延迟,甚至可能导致死锁
  • 当表大于缓冲池时,拥有“随机”主键(与自动递增或大致按时间顺序排列的东西相反)的成本非常高。你有多少公羊
  • “该表由系统的其他部分查询”——由随机PK?一次一排?多久一次
  • 请详细说明导出的
    是如何工作的。例如,它是否被其他东西重置为0
  • 是否只有一个客户负责所有工作?还是有多个服务器在表中抛出数据和查询?(需要不同的技术。)