0

我在 /var/log/mysql/mysql-slow.log 中记录了一个慢查询,使用 PDO 从 php 运行,当我将它复制粘贴到 mysql-client 中时,即使在重新启动 mysql 后,我也会立即得到答案。你怎么解释?

这是查询:

从 some_table u WHERE 中选择 many_fields(u.created_at >= '2011-11-01' AND u.created_at <= '2012-02-01' AND u.valid 为真且 u.test 为 FALSE);

这是查询的解释:

+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | u     | ALL  | NULL          | NULL | NULL    | NULL | 86460 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+

这是运行 php 脚本时 SHOW FULL PROCESSLIST 的输出:

+-----+---------+-----------+-----------------------+---------+------+-------+-----------------------+
| Id  | User    | Host      | db                    | Command | Time | State | Info                  |
+-----+---------+-----------+-----------------------+---------+------+-------+-----------------------+
|   9 |some_user| localhost | some_db               | Query   |    0 | NULL  | SHOW FULL PROCESSLIST |
| 187 |some_user| localhost | some_db               | Sleep   |    6 |       | NULL                  |
+-----+---------+-----------+-----------------------+---------+------+-------+-----------------------+
4

1 回答 1

1

正如您在回复我的评论时所说,您正在记录不使用索引的查询。此查询未使用索引,因此它会与慢查询一起记录。由于不使用索引而记录的查询在记录时会忽略最短执行时间。

编辑: 中的TimeSHOW FULL PROCESSLIST显示它处于当前状态的时间,通常设置为Sleep查询完成时,因此时间对于计时查询不可靠。要获得更可靠的查询时间,您需要使用分析或其他更直接与查询一起工作的基准测试方法。

于 2013-02-06T17:43:52.390 回答