【发布时间】:2019-09-03 07:38:09
【问题描述】:
我正在创建一个自定义分析系统,目前正在数据库设计过程中。我打算将 MariaDB 与 InnoDB 引擎一起使用,以便能够处理大负载。
我预计的数据可能是每天大约 50 万次点击。我需要将这些行插入到数据库中,这意味着我平均每秒大约有 5.8 次插入。但是,与此同时,我想记录是否有人访问了与该点击关联的页面。 (基本上是为了记录漏斗)
所以我打算做的是创建额外的列并搜索特定行的 ID,然后使用访问的确切时间更新该列。
我的第一个问题:这通常是推荐的设计数据库的方法吗?如果不是,那么设计数据库还有什么价值?
我唯一担心的是,在更新行时,表格会被锁定,并且无法进行插入,因此会降低用户体验。
我的第二个问题:这是我应该担心的事情吗,表在更新时会被锁定,从而减慢插入速度?会影响性能吗?
【问题讨论】:
-
My only concern is that while updating rows the Table will be locked, and can't do inserts- 你从哪里得到这个? InnoDB 锁定行,所以当你更新一行时——插入会被执行,不会有奇怪的挂起或糟糕的用户体验。您的性能在很大程度上取决于硬件。使用今天的硬件,如果您每秒进行 300 次插入/更新 - 您可能感觉不到。 -
@Mjh 从这里:oreilly.com/library/view/mysql-reference-manual/0596002653/… - 不是 100% 确定,但这是我的担心 - 也许这不是真的,这就是我问的原因。
-
@Mjh 太好了,所以基本上我应该走这条路就好了。
-
那个 O'Reilly 链接正在混合苹果和橙子。 InnoDB 是一个符合 MVCC 的引擎,因此在执行会阻碍插入的更新时没有全局表锁定。你的想法很好。
-
请记住,在大量插入或更新下的表/数据库可能会陷入死锁。这是 MySQL 避免竞争条件的机制。如果遇到死锁,请将其解释为警告并重复查询。