0

我目前正在从事的一个项目存在问题,该项目是用 PHP 和 MySQL 构建的。该项目本身类似于在线招标系统。用户对一个项目进行投标,如果他们再次点击并点击他们的投标,他们就有机会获胜。

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

我还想提一下,该项目是数据库密集型的(每页大约 30-40 个查询),我在想查询可能会延迟,但我不确定这是否正在发生。如果是这样的话,有什么建议可以避免这种类型的问题吗?

希望我至少对这个问题很清楚。这是我第一次发生这种情况,我将感谢您的帮助!

4

2 回答 2

0

你可以决定

  1. 优化或最小化所需的查询。
  2. 您可以缓存查询而不需要在每次访问时更新。
  3. 您可以使用 Summery 表
  4. 仅在更改时更新查询。

你必须巧妙地做到这一点。你可以关注这个 MySQLPerformanceBlog

于 2012-12-10T16:52:29.927 回答
0

我不清楚你在做什么,但让我详细说明你所说的。如果你在你的 MySQL 查询中使用 UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) 你有一个严重的问题。

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

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

您还必须清楚您的表正在使用哪个 MySQL 引擎。例如,像 InnoDB 这样的引擎使用MVCC多版本并发控制)。这意味着在读取一行时,可以同时对其进行写入。如果发生这种情况,数据库引擎将使用称为页表的东西来存储现有值,客户端将在更新新值时读取该值。这样,您就可以保证行级锁定,读取速度更快、更稳定,但写入速度可能更慢。

于 2012-12-10T17:05:49.600 回答