最初,我试图在我的脚本中查找缓慢的查询。困扰我的一件事是INSERT
查询,因为我在表中有几个索引(据我了解,在这种情况下,插入不会是瞬时的,因为每次都应重新计算索引)。
我的托管公司(站点)限制我访问MySQL日志,以调查缓慢查询的真实情况。因此,我需要搜索任何旁路方法来查找问题。
现在,我只是在phpmyadmin中执行可疑查询,并检查查询所花费的时间是否正常。
但是我看到这种方法的一些弱点:
我将基于当前服务器负载获取执行时间。因此,如果服务器当时很忙,我将得到夸大的时间。
如果查询被缓存,我将被低估时间。
我需要更改数据库数据以检查查询。对于SELECT
之类的查询来说还可以,但是对于DELETE
和UPDATE
来说却变得棘手。
因此,最好使用另一种方法。 EXPLAIN
是一个很好的解决方案,除非:EXPLAIN
仅对我的数据库服务器上的SELECT
查询有效(我有MySQL服务器的5.5.32版本,来自DOC的引用:Before MySQL 5.6.3, SELECT is the only explainable statement)。我可以用UPDATE
替换来解释DELETE
和EXPLAIN SELECT
(对吗?),但是EXPLAIN INSERT
仍然是一个大问题。
所以问题是:
如果至少有一个索引,INSERT
会变慢,对吗?
我可以通过EXPLAIN UPDATE
替换DELETE
和EXPLAIN SELECT
吗?
除了提到的phpmyadmin执行和EXPLAIN之外,哪些方法可以用来调查查询速度?
我正在使用InnoDB
引擎。
最佳答案
INSERT
必须为插入的每一行更新所有索引。但是,对于单行,我们最多只能说毫秒。INSERT ... SELECT ...
可以任意插入许多行-SELECT或INSERT可能是问题。INSERT ... VALUES (1,2,3), (4,5,6), ...
(“批处理”插入)比单个插入要快,但仍然应该不是很大的问题。
当然,DELETE
和UPDATE
可以任意触摸许多行,因此速度很慢。将它们变成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/