php - MySQL 查询随机滞后

我的查询如下所示:

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 服务器)

https://stackoverflow.com/questions/20590013/

相关文章:

php - 如何使用 laravel 连接 mysql?

mysql - 将 Django DB 从 SQLite 迁移到 MySQL 的最佳方法是什么?

mysql - 在 Postgresql 中模拟 MySQL 的 ORDER BY FIELD()

c# - 将C#中的DateTime转换为yyyy-MM-dd格式并存储到MySql DateTim

php - Laravel OrderBy 关系计数

mysql - 错误 2002 (HY000) : Can't connect to local M

php - 一次查询 MySQL 插入多行

mysql - 使用 mysql 查询获取字符串的最后 5 个字符

php - Doctrine2 迁移向下迁移并从浏览器而不是命令行迁移

mysql - 如果另一列为空,则选择一列