最初我试图在我的脚本中查找慢查询。困扰我的一件事是INSERT
查询,因为我在表中有几个索引(因为我可以理解插入在这种情况下不会是瞬时的,因为每次都应该重新计算索引)。
我的托管公司(siteground)限制我访问MySQL日志以调查慢查询的真实情况。所以我需要搜索任何旁路方式来找到问题。
现在我只是在phpmyadmin中执行可疑查询,并检查查询所用的时间是否正常。
但是我看到了这种方法的一些弱点:
我将根据当前服务器负载获得执行时间。因此,如果当时服务器很忙,我会被夸大时间。
如果查询被缓存,我将被低估时间。
我需要更改真实的DB数据以检查查询。对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
引擎。
答案 0 :(得分:1)
INSERT
必须更新插入的每一行的所有索引。但是,对于单行,我们最多只谈毫秒。
INSERT ... SELECT ...
可以插入任意多行 - SELECT或INSERT可能是问题。
INSERT ... VALUES (1,2,3), (4,5,6), ...
(一个'批量'插入)比单个插入更快,但仍然不应该是一个大问题。
DELETE
和UPDATE
可以触及任意多行,因此非常慢。将它们变为SELECT
,然后执行EXPLAIN SELECT ...
并计时。
有关更具体的帮助,请向我们展示SHOW CREATE TABLE
,告诉我们你有多少内存以及innodb_buffer_pool_size的值(应该是可用内存的70%左右)。
你写的'脚本'是什么?把计时器放在他们周围。例如,在PHP中,使用microtime(true)
。在Perl中使用Time::HiRes
。