MySQL的EXPLAIN INSERT不可用:如何理解INSERT是否缓慢?

时间:2015-03-14 19:55:41

标签: php mysql performance innodb mysql-slow-query-log

最初我试图在我的脚本中查找慢查询。困扰我的一件事是INSERT查询,因为我在表中有几个索引(因为我可以理解插入在这种情况下不会是瞬时的,因为每次都应该重新计算索引)。

我的托管公司(siteground)限制我访问MySQL日志以调查慢查询的真实情况。所以我需要搜索任何旁路方式来找到问题。

现在我只是在phpmyadmin中执行可疑查询,并检查查询所用的时间是否正常。

但是我看到了这种方法的一些弱点:

  • 我将根据当前服务器负载获得执行时间。因此,如果当时服务器很忙,我会被夸大时间。

  • 如果查询被缓存,我将被低估时间。

  • 我需要更改真实的DB数据以检查查询。对SELECT这样的查询来说没问题,但DELETEUPDATE会变得棘手。

因此使用其他方法要好得多。 EXPLAIN可能是一个很好的解决方案,除非:

  • EXPLAIN仅适用于我的数据库服务器上的SELECT查询(我有MySQL服务器的5.5.32版,来自DOC的引用:Before MySQL 5.6.3, SELECT is the only explainable statement)。我可以通过UPDATE替换来解析DELETEEXPLAIN SELECT是正确的吗?),但EXPLAIN INSERT仍然是个大问题。

所以问题是:

  1. 如果至少有一个索引,我INSERT 可以是否正确?

  2. 我可以EXPLAIN UPDATEDELETE进行EXPLAIN SELECT替换吗?

  3. 除了提到的phpmyadmin执行和EXPLAIN之外,哪些方法可用于调查查询速度?

  4. 我正在使用InnoDB引擎。

1 个答案:

答案 0 :(得分:1)

INSERT必须更新插入的每一行的所有索引。但是,对于单行,我们最多只谈毫秒。

INSERT ... SELECT ...可以插入任意多行 - SELECT或INSERT可能是问题。

INSERT ... VALUES (1,2,3), (4,5,6), ...(一个'批量'插入)比单个插入更快,但仍然不应该是一个大问题。

当然,

DELETEUPDATE可以触及任意多行,因此非常慢。将它们变为SELECT,然后执行EXPLAIN SELECT ...并计时。

有关更具体的帮助,请向我们展示SHOW CREATE TABLE,告诉我们你有多少内存以及innodb_buffer_pool_size的值(应该是可用内存的70%左右)。

你写的'脚本'是什么?把计时器放在他们周围。例如,在PHP中,使用microtime(true)。在Perl中使用Time::HiRes