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

我的托管公司(站点)限制我访问MySQL日志,以调查缓慢查询的真实情况。因此,我需要搜索任何旁路方法来查找问题。

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

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


我将基于当前服务器负载获取执行时间。因此,如果服务器当时很忙,我将得到夸大的时间。
如果查询被缓存,我将被低估时间。
我需要更改数据库数据以检查查询。对于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仍然是一个大问题。


所以问题是:


如果至少有一个索引,INSERT会变慢,对吗?
我可以通过EXPLAIN UPDATE替换DELETEEXPLAIN SELECT吗?
除了提到的phpmyadmin执行和EXPLAIN之外,哪些方法可以用来调查查询速度?


我正在使用InnoDB引擎。

最佳答案

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

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

INSERT ... VALUES (1,2,3), (4,5,6), ...(“批处理”插入)比单个插入要快,但仍然应该不是很大的问题。

当然,DELETEUPDATE可以任意触摸许多行,因此速度很慢。将它们变成SELECT,然后执行EXPLAIN SELECT ...并计时。

要获得更具体的帮助,请向我们显示SHOW CREATE TABLE,告诉我们您有多少RAM以及innodb_buffer_pool_size的值(应约为可用RAM的70%)。

您写的“脚本”是什么?在它们周围放置计时器。例如,在PHP中,使用microtime(true)。在Perl中使用Time::HiRes

关于php - MySQL EXPLAIN INSERT不可用:如何了解INSERT是否缓慢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29053507/

10-11 12:40