为啥 phpmyadmin 会比 mysql 命令行快得多?

Posted

技术标签:

【中文标题】为啥 phpmyadmin 会比 mysql 命令行快得多?【英文标题】:Why would phpmyadmin be significantly faster than the mysql command line?为什么 phpmyadmin 会比 mysql 命令行快得多? 【发布时间】:2017-10-12 04:49:10 【问题描述】:

一切都在数据库所在的同一台机器上运行。这些查询以不同的方式做同样的事情。我使用 mariadb 作为数据库引擎。

查询 1:

SELECT p.* 
FROM users as u INNER JOIN votes ON u.Id=votes.UserId INNER JOIN posts as p ON p.Id=votes.PostId 
WHERE (SELECT MIN(u2.reputation) 
       FROM users as u2 INNER JOIN votes ON u2.Id=votes.UserId INNER JOIN posts as p2 ON p2.Id=votes.PostId 
       WHERE p2.Id=p.Id) >= 
ORDER BY p.Id;

mysql命令行大约2.9秒,phpmyadmin大约0.1秒

查询 2:

SELECT P.*
FROM posts as P 
    JOIN votes AS V on P.Id=V.PostId
    JOIN users AS U on V.UserId=U.Id
WHERE U.Reputation >=
    AND P.Id NOT IN 
    (SELECT DISTINCT (P2.Id)
    FROM posts P2, votes V2,users U2
    WHERE P2.Id=V2.PostId
        AND V2.UserId =U2.Id
        AND U2.reputation < )
ORDER BY P.Id;

在 mysql 命令行中大约需要 3.1 秒,在 phpmyadmin 中大约需要 0.9 秒。

这些时间都取自运行查询后自动显示的时间。

为什么 phpmyadmin 会更快?为什么phpmyadmin中的速度百分比差异如此之大,而在mysql命令行中却没有?

【问题讨论】:

你确定它们在同一个数据库上运行吗?有大量的结果吗?管理工具可能正在应用LIMIT 子句。 是的,我确定它们在同一个数据库上运行 正如@tadman 建议的那样,我很确定 PHPMyAdmin 通过将LIMIT 应用于您的查询来限制从数据库返回的记录数以提高性能。如果默认一次只显示 25 条(限制为 500 条),则不会返回 1000 万条记录。 @tadman 将有关限制条款的内容放在答案中,我会接受它,并在对该答案的评论中提供更多信息。 【参考方案1】:

根据您使用的存储引擎,很可能是从数据缓存而不是查询缓存加载数据。时间差太大了,如果你清理缓存再运行查询,你会注意到差异

【讨论】:

【参考方案2】:

像 phpMyAdmin 这样的前端工具通常会在 LIMIT 子句上装订,以便对结果进行分页而不会使浏览器或应用程序在大型表格上崩溃。一个可能返回数百万条记录的查询,这样做会花费大量时间,如果受到更多限制,它将运行得更快。

将有限的查询与完整的查询进行比较并不公平,检索时间会显着不同。检查这两个工具是否都在获取所有记录。

【讨论】:

似乎是这样,phpmyadmin中每页返回的默认行数是25,所以当我将limit 25传递给mysql cli时,我在mysql命令行中得到的次数与在 phpmyadmin 中【参考方案3】:

当我上传数据并将数据插入现有表时,我只是对大约 1800 万条记录进行常规的简单插入语句,我认为这在很大程度上取决于您的设置和硬件。微调 phpmyadmin 以在您的硬件上获得最佳性能,我花了一段时间远程完成这项工作,因此决定在服务器中上传一个简单的命令行。 Phpmyadmin,一次中断大约 500 行,并且一次又一次地发送查询,几次,所以连接不会超时。它按块进行下载和上传。虽然 phpmyadmin 花了大约 10 分钟以上的时间来完成这项工作,但命令行是即时的。

无论花费多少时间来读取和上传相同的 SQL 导入文件,phpmyadmin 都会因超时问题而慢几倍。它与许多因素有关,php.ini 设置,例如内存和最大变量,http 服务器设置(apache 设置与带有 php7-fastcgi 参数的 nginx 不同等)甚至 php 的版本也很重要,因为 phpmyadmin 可以完美地与某些版本,有时不能像其他人那样工作。如果您进行大量数据传输,最好从命令行使用直接转储。 phpmyadmin 非常适合细节、小导入和导出以及快速修复,但浏览器在中间,所以我想直接的数据输入输出总是更好更快。因此,要回答您的问题,取决于设置、硬件和您正在做的工作以及您的工作方式。这是我谦虚的建议。

【讨论】:

已经给出了解决方案,只是 phpmyadmin 通过它的查询传递了一个限制子句,而 sql cli 没有。这就是导致时间差异的原因。 phpmyadmin 可能会因为选择的限制而更快,但问题并不仅仅针对 SELECT,它只是给出了几个查询示例。我指的是整体表现。对大型数据库进行 UPDATE 或 INSERT 操作,您会发现差别很大。

以上是关于为啥 phpmyadmin 会比 mysql 命令行快得多?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在postgresql的json数据中查询,速度会比mysql慢很多

phpmyadmin 配置完全后为啥显示的是 Index of /phpmyadmin

错误 #1064:phpMyAdmin 导入在 MYSQL 数据库中显示 html 错误 - 为啥是 html?

为啥 MySQL LEFT JOIN 不返回所有行,除非有 WHERE 子句 - phpMyAdmin 问题

为啥当我启动 phpmyadmin 时会出现这样的文字?

phpmyadmin #1045 无法登录 MySQL 服务器。安装mysql命令行客户端后