MySQL和UNIX_TIMESTAMP插入错误

时间:2012-12-10 16:39:03

标签: php mysql

我目前正在处理的项目存在问题,内置于PHP& MySQL的。该项目本身类似于在线竞标系统。用户对某个项目进行投标,如果他们通过再次点击和修改来跟进他们的出价,他们就有机会获胜。

问题在于:如果5个用户例如同时进入游戏,我在数据库中得到8-10秒的延迟 - 我使用UNIX_TIMESTAMP(CURRENT_TIMESTAMP)更新数据库,这使得整个系统出价没用。

我还想提一下,该项目是数据库密集型的(每页大约30-40个查询),我想也许查询会被延迟,但我不确定是否会发生这种情况。如果是这种情况,任何建议如何避免这类问题?

希望我至少清楚这个问题。这是第一次发生在我身上,我很感激你的帮助!

2 个答案:

答案 0 :(得分:0)

你可以决定

  1. 优化或最小化所需的查询。
  2. 您可以缓存查询,无需在每次访问时更新。
  3. 您可以使用Summery表格
  4. 仅根据更改更新查询。
  5. 你必须巧妙地做到这一点。您可以关注此MySQLPerformanceBlog

答案 1 :(得分:0)

我不清楚你在做什么,但让我详细说明你说的话。如果您在MySQL查询中使用UNIX_TIMESTAMP(CURRENT_TIMESTAMP())则会出现严重问题。

您的方法存在的问题是您使用MySQL函数来提供将存储在数据库中的时间戳记录。这是一个问题,因为在生成时间戳之前你必须等待MySQL解析并执行你的查询(而某些MySQL引擎如MyISAM使用表级锁定)。由于行级锁定粒度,其他引擎(如InnoDB)的写入速度较慢。这意味着存储在行中的时间不一定反映生成请求以插入所述行的时间。此外,它还可能意味着您从数据库中读取的时间不一定是最新的记录(假设您在将记录插入表格后更新记录)。

您需要的是生成SQL查询的PHP请求,以直接在SQL查询中提供TIMESTAMP。这意味着时间戳反映了PHP接收请求的时间,而不一定是行插入/更新到数据库的时间。

您还必须明确您正在使用的MySQL引擎。例如,像InnoDB这样的引擎使用MVCC多版本并发控制)。这意味着在读取行时,可以同时写入。如果发生这种情况,数据库引擎会使用称为页表的内容来存储在更新新值时客户端将读取的现有值。这样,您可以保证行级锁定具有更快和更稳定的读取,但写入速度可能更慢。