MySQL的EXPLAIN INSERT不可用:如何理解INSERT是否慢?
MySQL's EXPLAIN INSERT unavailable: how to understand if INSERT is slow or not?
最初我试图在我的脚本中查找慢速查询。困扰我的一件事是 INSERT
查询,因为我在 table 中有几个索引(据我所知,在这种情况下插入不会是即时的,因为每次都应该重新计算索引) .
我的托管公司 (siteground) 限制我访问 MySQL 日志以调查查询缓慢的真实情况。所以我需要搜索任何旁路方式来找到问题。
现在我只是在 phpmyadmin 中执行可疑查询并检查查询所用的时间是否正常。
但是我看到了这种方法的一些弱点:
我将根据当前服务器负载获取执行时间。所以如果当时服务器很忙,我会夸大时间。
如果查询被缓存,我将得到低估的时间。
我需要真正更改数据库数据以检查查询。对于 SELECT
这样的查询是可以的,但是对于 DELETE
和 UPDATE
.
就变得棘手了
所以换一种方法会好很多。 EXPLAIN
可能是一个很好的解决方案,除非:
EXPLAIN
仅适用于我的数据库服务器上的 SELECT
查询(我有 MySQL 服务器的 5.5.32 版,文档引用:Before MySQL 5.6.3, SELECT is the only explainable statement) .我可以通过 EXPLAIN SELECT
替换来解释 UPDATE
和 DELETE
( 正确吗?)但是 EXPLAIN INSERT
仍然是一个大问题。
所以问题是:
如果至少有一个索引,INSERT
可以变慢吗?
我可以用EXPLAIN SELECT
代替EXPLAIN UPDATE
和DELETE
吗?
除了提到的 phpmyadmin 执行和 EXPLAIN 之外,还有哪些方法可以用来调查查询速度?
我正在使用 InnoDB
引擎。
INSERT
必须为插入的每一行更新所有索引。但是,对于单行,我们最多谈论毫秒。
INSERT ... SELECT ...
可以插入任意多行 - SELECT 或 INSERT 可能是问题所在。
INSERT ... VALUES (1,2,3), (4,5,6), ...
(一个 'batched' 插入)比单个插入更快,但问题不大。
DELETE
和 UPDATE
当然可以触及任意多行,因此非常慢。将它们变成 SELECT
,然后做 EXPLAIN SELECT ...
并计时。
如需更具体的帮助,请向我们展示 SHOW CREATE TABLE
,告诉我们您有多少 RAM 以及 innodb_buffer_pool_size 的值(应约为可用 RAM 的 70%)。
你的'scripts'是用什么写的?在他们周围放置计时器。例如,在 PHP 中,使用 microtime(true)
。在 Perl 中使用 Time::HiRes
.
最初我试图在我的脚本中查找慢速查询。困扰我的一件事是 INSERT
查询,因为我在 table 中有几个索引(据我所知,在这种情况下插入不会是即时的,因为每次都应该重新计算索引) .
我的托管公司 (siteground) 限制我访问 MySQL 日志以调查查询缓慢的真实情况。所以我需要搜索任何旁路方式来找到问题。
现在我只是在 phpmyadmin 中执行可疑查询并检查查询所用的时间是否正常。
但是我看到了这种方法的一些弱点:
我将根据当前服务器负载获取执行时间。所以如果当时服务器很忙,我会夸大时间。
如果查询被缓存,我将得到低估的时间。
我需要真正更改数据库数据以检查查询。对于
SELECT
这样的查询是可以的,但是对于DELETE
和UPDATE
. 就变得棘手了
所以换一种方法会好很多。 EXPLAIN
可能是一个很好的解决方案,除非:
EXPLAIN
仅适用于我的数据库服务器上的SELECT
查询(我有 MySQL 服务器的 5.5.32 版,文档引用:Before MySQL 5.6.3, SELECT is the only explainable statement) .我可以通过EXPLAIN SELECT
替换来解释UPDATE
和DELETE
( 正确吗?)但是EXPLAIN INSERT
仍然是一个大问题。
所以问题是:
如果至少有一个索引,
INSERT
可以变慢吗?我可以用
EXPLAIN SELECT
代替EXPLAIN UPDATE
和DELETE
吗?除了提到的 phpmyadmin 执行和 EXPLAIN 之外,还有哪些方法可以用来调查查询速度?
我正在使用 InnoDB
引擎。
INSERT
必须为插入的每一行更新所有索引。但是,对于单行,我们最多谈论毫秒。
INSERT ... SELECT ...
可以插入任意多行 - SELECT 或 INSERT 可能是问题所在。
INSERT ... VALUES (1,2,3), (4,5,6), ...
(一个 'batched' 插入)比单个插入更快,但问题不大。
DELETE
和 UPDATE
当然可以触及任意多行,因此非常慢。将它们变成 SELECT
,然后做 EXPLAIN SELECT ...
并计时。
如需更具体的帮助,请向我们展示 SHOW CREATE TABLE
,告诉我们您有多少 RAM 以及 innodb_buffer_pool_size 的值(应约为可用 RAM 的 70%)。
你的'scripts'是用什么写的?在他们周围放置计时器。例如,在 PHP 中,使用 microtime(true)
。在 Perl 中使用 Time::HiRes
.