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