为什么 phpmyadmin 会比 mysql 命令行快得多?
Why would phpmyadmin be significantly faster than the mysql command line?
一切都运行在数据库所在的同一台机器上。这些查询以不同的方式做同样的事情。我正在使用 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 命令行中却没有?
根据您使用的存储引擎,数据很可能是从数据缓存而不是查询缓存加载的。时间差太大了,如果你清理缓存再运行查询,你会发现差异
像 phpMyAdmin 这样的前端工具通常会使用 LIMIT
子句来对结果进行分页,而不会使您的浏览器或应用程序在大型表格上崩溃。一个可能 return 数百万条记录的查询,这样做会花费很多时间,如果限制更多,会 运行 更快。
将有限的查询与完整的查询进行比较并不公平,检索时间会大不相同。检查两个工具是否都在提取所有记录。
虽然我正在向现有的 table 上传和插入数据,但只是对大约 1800 万条记录进行常规的简单插入语句,我认为这在很大程度上取决于您的设置和硬件。微调 phpmyadmin 以在您的硬件上获得最佳性能,远程完成这项工作花了我一段时间,因此决定在服务器中使用简单的命令行上传。 Phpmyadmin,一次中断大约 500 行,并一次又一次地发送查询,多次,因此连接不会超时。它按块进行下载和上传。虽然 phpmyadmin 花费了大约 10 分钟以上的时间来完成这项工作,但命令行很简单。
无论读取和上传相同的 SQL 导入文件花费多少时间,它都会慢几倍 phpmyadmin 并出现超时问题。它与许多因素有关,php.ini 设置,例如内存和最大变量,http 服务器设置(apache 设置不同于带有 php7-fastcgi 参数的 nginx 等等)甚至 [=16 的版本=] 很重要,因为 phpmyadmin 在某些版本上工作得很好,但有时不能像在其他版本上那样工作。如果您执行大量数据 xfer,最好从命令行使用直接转储。 phpmyadmin 非常适合细节、小的导入和导出以及快速修复,但浏览器处于中间位置,所以我想直接的数据输入输出总是更好更快。所以,要回答你的问题,是关于设置、硬件和你正在做的工作以及你是如何做的。这是我的拙见。
一切都运行在数据库所在的同一台机器上。这些查询以不同的方式做同样的事情。我正在使用 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 命令行中却没有?
根据您使用的存储引擎,数据很可能是从数据缓存而不是查询缓存加载的。时间差太大了,如果你清理缓存再运行查询,你会发现差异
像 phpMyAdmin 这样的前端工具通常会使用 LIMIT
子句来对结果进行分页,而不会使您的浏览器或应用程序在大型表格上崩溃。一个可能 return 数百万条记录的查询,这样做会花费很多时间,如果限制更多,会 运行 更快。
将有限的查询与完整的查询进行比较并不公平,检索时间会大不相同。检查两个工具是否都在提取所有记录。
虽然我正在向现有的 table 上传和插入数据,但只是对大约 1800 万条记录进行常规的简单插入语句,我认为这在很大程度上取决于您的设置和硬件。微调 phpmyadmin 以在您的硬件上获得最佳性能,远程完成这项工作花了我一段时间,因此决定在服务器中使用简单的命令行上传。 Phpmyadmin,一次中断大约 500 行,并一次又一次地发送查询,多次,因此连接不会超时。它按块进行下载和上传。虽然 phpmyadmin 花费了大约 10 分钟以上的时间来完成这项工作,但命令行很简单。
无论读取和上传相同的 SQL 导入文件花费多少时间,它都会慢几倍 phpmyadmin 并出现超时问题。它与许多因素有关,php.ini 设置,例如内存和最大变量,http 服务器设置(apache 设置不同于带有 php7-fastcgi 参数的 nginx 等等)甚至 [=16 的版本=] 很重要,因为 phpmyadmin 在某些版本上工作得很好,但有时不能像在其他版本上那样工作。如果您执行大量数据 xfer,最好从命令行使用直接转储。 phpmyadmin 非常适合细节、小的导入和导出以及快速修复,但浏览器处于中间位置,所以我想直接的数据输入输出总是更好更快。所以,要回答你的问题,是关于设置、硬件和你正在做的工作以及你是如何做的。这是我的拙见。