我正在创建一个自定义分析系统,目前正在数据库设计过程中。我计划将MariaDB与InnoDB引擎一起使用,以便能够处理大负载。
我期望的数据可能是每天约50万次点击。我将需要将这些行插入数据库,这意味着我平均每秒大约有5.8次插入。但是,与此同时,我想记录是否有人访问了与该点击相关的页面。 (基本上是记录渠道)
所以我打算做的是创建其他列,并搜索特定行的ID,然后用确切的访问时间更新该列。
我的第一个问题:通常这样推荐的设计数据库的方法吗?如果没有,那么设计数据库还有什么价值?
我唯一担心的是,在更新行时,表将被锁定,并且无法进行插入,因此会降低用户体验。
我的第二个问题:这是我应该担心的问题,该表在更新时被锁定,从而减慢了插入速度吗?它会影响性能吗?
答案 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列):
当您要显示包括计数器在内的信息时,通过JOIN
到id
足够简单(并且足够快)。
正如已经指出的那样,行被锁定,而不是表。