php - MySQL 查询随机滞后

标签 php mysql pdo

我的查询如下所示:

SELECT id FROM user WHERE id='47'

使用分析数据时,此查询的 ID 已编入索引并且读取速度总是很快。

SET profiling = 1;
SHOW PROFILES;

查询总是在 0.0002 秒左右执行。

但是,如果我从 PHP 端分析查询,如下所示:

$current = microtime(true);
$data = $conn->query($full_query);
$elapsed = microtime(true) - $current;

然后偶尔可能有 50 个查询中的 1 个需要大约 0.2 秒。但是,在我的测试脚本中,我有代码来测试它,它使用 SET profiling = 1; 来分析查询。即使通过 PDO 的 PHP 往返行程可能是 0.2 秒,但查询时间仍然是 0.0002。

我知道或知道不会导致问题的事情:

  1. 查询并不慢。当我从同一个查询运行中查看相同的查询时,在 PHP 中进行分析并使用 SET PROFILING 进行分析时,查询总是很快并且从未记录在慢查询日志中,即使它显示从 PHP 端需要 0.2 秒。<
  2. 这与 skip-name-resolve 无关 - 这是不一致的,我已经启用了 skip-name-resolve
  3. 这与查询缓存无关,这两种行为都存在
  4. 即使查询从缓存中出来,也会发生这种行为。
  5. 该查询实际上并未选择 ID,但我使用此查询进行测试以表明这不是磁盘访问问题,因为该字段肯定已编入索引。
  6. 这个表只有 10-20 兆,索引为 1 兆。机器显示的负载非常小,并且 innodb 没有使用它的所有缓冲区。
  7. 这是针对除我的测试查询之外没有其他事件的表进行测试的。

有人知道还有什么要检查的吗?在我看来,这似乎是一个网络问题,但我需要能够看到它并找到解决它的问题,而且我已经没有地方可以检查了。有什么想法吗?

最佳答案

我会分析机器。

您说这种情况每 50 次发生约 1 次,并且每个查询都有 0.2 秒的基准。您应该能够将 top 放在屏幕上,然后在 PHP 中运行循环查询以对 RDBMS 进行负载测试并收集性能统计信息。

您可能需要运行超过 50 * 0.2 =10 秒,因为您的“50 分之一”统计数据可能是基于手动运行的单个查询-基于我在您的描述中读到的内容。尝试 30 秒和 90 秒的负载测试。

在此期间,请注意您的 top 进程屏幕。按 P 按 CPU 对其进行排序。每次您按“P”时,它都会更改进程 CPU 消耗的排序顺序,因此请确保您将最消耗的排在最前面。 (按 M 按内存使用情况排序。查看 the man page 了解更多信息)

在负载测试期间寻找任何浮出水面的东西。您应该会看到一些东西跳得更高 - 但只是瞬间。
(注意,这样的进程可能不会到达列表的顶部——它不需要,但仍然可能引入足够的磁盘负载或其他事件来滞后 MySQL 服务器)

关于php - MySQL 查询随机滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20590013/

相关文章:

mysql - 具有多个 AND OR WHERE 条件的复杂 MySQL 查询

php - 将列拆分为单独的变量

php - 通过root自动获取包含以下内容的邮件?

php - PDO。数据库管理器类 - 非对象上的函数 query()

PHP:一次搜索更多表格?

php - 在 unicode 中显示的 html 标记属性

php - 使用 PHP 从 SOAP 响应中解析 CDATA

javascript - 一段时间后 YouTube 视频 ID 发生变化

php - 警告 : Illegal string offset 'todo' | PHP

php - 为什么 SQL SELECT 语句不检索 PHP 日历的相关日期?