0

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

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

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

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

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

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

  • 我需要真正更改数据库数据以检查查询。像这样的查询是可以的SELECT,但是对于DELETEand就变得棘手了UPDATE

所以最好使用另一种方法。EXPLAIN可以是一个很好的解决方案,除非:

  • EXPLAIN仅适用SELECT于我的数据库服务器上的查询(我有 MySQL 服务器的 5.5.32 版本,来自文档的引用:在 MySQL 5.6.3 之前,SELECT 是唯一可解释的语句)。我可以解释UPDATEDELETE通过EXPLAIN SELECT替换(正确吗?)但EXPLAIN INSERT仍然是一个大问题。

所以问题是:

  1. 如果至少有一个索引,我说得对INSERT 吗?

  2. 我可以EXPLAIN UPDATE通过DELETE替换EXPLAIN SELECT吗?

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

我正在使用InnoDB引擎。

4

1 回答 1

1

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.

于 2015-03-15T03:35:07.950 回答