我遇到过一个PHP论坛软件,它每小时更新一次线程视图 因此,每次查看线程时,都会将一行插入到具有线程ID的threadviews表中,然后脚本每小时运行一次并更新线程表中的实际视图计数。
我的问题是,这背后的逻辑是什么?为什么不直接更新线程表(即views = views + 1)?
答案 0 :(得分:4)
更新通常比插入慢,您可以将更新视为删除和插入。更新可能需要锁定才能支持DBMS的ACID合规性,而插入则没有任何锁定。
此外,由于并发性,你不想锁定行,等待更新完成,想一想,发生了什么,当你更新时,你得到一个新的访问者,你将失去那个访问者。这称为丢失更新。另一方面,cron作业每小时聚合一次访问和更新,因为该行是只读的,写锁定不会影响更新期间的读取。
答案 1 :(得分:0)
插入可能总是更快。看看就像这样。
更新首先搜索要更新的所有帖子。在一些可能需要很长时间的表中,但是使用神指数它应该很快。然后是数据更新,每次更新都需要检查表约束并可能更新索引。
插入在没有搜索的情况下是相同的。它也总是一行(或者它可能更多但实际上它不止一个插入......)必须根据约束和更新索引进行检查。