我可以在使用MariaDB或MySQL更新多个不同行的同时插入表吗?

时间:2019-04-12 13:56:19

标签: mysql mariadb innodb

我正在创建一个自定义分析系统,目前正在数据库设计过程中。我计划将MariaDB与InnoDB引擎一起使用,以便能够处理大负载。

我期望的数据可能是每天约50万次点击。我将需要将这些行插入数据库,这意味着我平均每秒大约有5.8次插入。但是,与此同时,我想记录是否有人访问了与该点击相关的页面。 (基本上是记录渠道)

所以我打算做的是创建其他列,并搜索特定行的ID,然后用确切的访问时间更新该列。

我的第一个问题:通常这样推荐的设计数据库的方法吗?如果没有,那么设计数据库还有什么价值?

我唯一担心的是,在更新行时,表将被锁定,并且无法进行插入,因此会降低用户体验。

我的第二个问题:这是我应该担心的问题,该表在更新时被锁定,从而减慢了插入速度吗?它会影响性能吗?

2 个答案:

答案 0 :(得分:2)

如果执行更新,InnoDB不会锁定要插入的表。您的用户不会遇到任何奇怪的问题。

这是MVCC compliant engine,旨在处理对基础表的并发访问。

您可以通过选择appropriate isolation level来控制引擎的行为,但是默认值(REPEATABLE READ)很好,并且做得更好。

如果一个表被多个用户(不是连接到您的站点的用户,而是通过脚本语言或其他服务建立到MySQL的连接的用户)修改,并且有许多插入/更新/删除操作-MySQL可能会抛出错误,提示发生死锁。

死锁是一个警告,而不是错误,表明有1个以上的线程试图访问占用的资源(例如,两个线程试图同时更新同一行,但只有1个线程可以这样做) 。这表明您应该重复查询。

在处理I / O较重的MySQL时,我建议您以自己选择的语言处理所有可能的情况。

〜6次插入不是很多,请确保您允许MySQL访问足够的系统资源。对于InnoDB,请稍微检查一下innodb_buffer_pool_size或google的值,以了解它的含义以及如何使用它来使数据库快速运行。

祝你好运!

答案 1 :(得分:1)

只有5.6 /秒,不会有太大问题。

但是,我确实建议对“喜欢”,“赞”,“点击”和类似内容进行垂直分区。这些往往会有大量UPDATEs个随机的单行,并且可能会干扰其他活动。

也就是说,有一个单独的表(可能只有2列):

  • 被点赞/点击/等项目的ID。
  • 柜台。

当您要显示包括计数器在内的信息时,通过JOINid足够简单(并且足够快)。

正如已经指出的那样,被锁定,而不是