所有内容都在数据库所在的同一台机器上运行。这些查询以不同的方式执行相同的操作。我正在使用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命令行中却没有?
答案 0 :(得分:5)
像phpMyAdmin这样的前端工具经常在LIMIT
子句上使用,以便对结果进行分页,而不会在大型表上崩溃浏览器或应用程序。一个可能返回数百万条记录的查询,这样做需要花费很多时间,如果受到更多约束,它的运行速度会更快。
将有限查询与完整查询进行比较并不公平,检索时间会有很大差异。检查两个工具是否都在获取所有记录。
答案 1 :(得分:0)
根据您使用的存储引擎,很可能是从数据缓存而不是查询缓存加载数据。时差太大,如果清理缓存并再次运行查询,您会发现差异
答案 2 :(得分:-2)
尽管我正在将数据上传并插入到现有表中,只是对大约1800万条记录的常规简单插入语句,但我认为这很大程度上取决于您的设置和硬件。对phpmyadmin进行微调以使其在硬件上获得最佳性能,我花了一些时间才能远程完成该工作,因此决定在服务器中以简单的命令行上传。 Phpmyadmin,一次中断约500行,并且确实一次又一次地发送查询,因此连接不会超时。它按块进行下载和上传。尽管phpmyadmin花费了大约10分钟以上的时间来完成这项工作,但命令行是中间的。
无论读取和上传相同的SQL导入文件花了什么时间,phpmyadmin都比超时慢了好几倍,而且有超时问题。它与很多因素有关,例如内存和最大变量等php.ini设置,http服务器设置(apache设置与带有php7-fastcgi参数的nginx等等)甚至是php版本也很重要,因为phpmyadmin可以完美地与某些版本,有时无法与其他人一起使用。如果您要处理大量数据,最好从命令行使用直接转储。 phpmyadmin非常适合详细信息,少量导入和导出以及快速修复,但是浏览器位于中间,因此我想直接数据输入输出总是更好,更快。因此,要回答您的问题,涉及设置,硬件和您正在做的工作以及如何做。那是我的卑鄙建议。