我正在使用PHP和mysql在我的localhst中开发一个脚本,我正在处理大量数据(大约有两百万条用于科学研究的记录)
我需要在生活中调用一次查询(分析数据并准备一些数据);但是例如需要很长时间:现在我的脚本正在分析一些数据超过4小时
我知道我的数据库优化可能会遇到一些问题我不是专家
例如,我发现“索引”对于加速查询非常有用 然而,即使索引某些列,我的脚本仍然很慢任何想法如何加速我的脚本(在PHP和MySQL中)
我使用XAMPP作为服务器包
非常感谢您的帮助
最好的问候
更新1:
$sql = "select * from urls";//10,000 record of cached HTML documents
$result = $DB->query($sql);
while($row = $DB->fetch_array($result)){
$url_id = $row["id"];
$content = $row["content"];
$dom = new DOMDocument();
@$dom->loadHTML($content);
$xpath = new DOMXPath($dom);
$row = $xpath->evaluate("/html/body//a");
for($i = 0; $i < $row->length; $i++) {
// lots of the code here to deal with the HTML documents and some update and insert and select queries which query another table which has 1 million record
}
更新2:
我的quires中没有“JOIN”,甚至没有“IN”
它们是非常简单的查询
并且不知道!我不知道怎么知道导致缓慢的原因是什么?
是PHP还是MYSQL?
答案 0 :(得分:12)
首先,为了能够有效地进行优化,您需要知道花时间:
根据这些信息,您可以尝试找出:
仍然:这是一个非常具体的问题,答案可能也非常具体 - 这意味着如果你想要的不仅仅是一般的答案,那么可能需要更多的信息...
编辑后编辑
由于您只有简单的查询,事情可能会更容易......也许。
select * from a where x = 12
”和“select * from a where x = 14
”属于同一类型:相同的选择,相同的表,相同的where子句 - 只有值更改EXPLAIN
将有助于
microtime
将帮助您找出它们是哪些
在此之前,要了解PHP是否运行得太多,或者它是否是MySQL,一种简单的方法是在Linux上使用“top”命令,或者使用“进程管理器”(我不在Windows上,以及不要用英语 - 实名可能是其他的东西)。
如果PHP正在吃100%的CPU,那么你就有罪魁祸首。如果MySQL正在吃掉所有CPU,你也有罪魁祸首。
当你知道哪一个工作太多时,这是第一步:你知道首先要优化什么。
我从你的代码部分看到你是:
如果你有一个多核CPU,一个想法(如果我看到PHP占用大量CPU,我会尝试)将并行化。
例如,您可以同时运行两个PHP脚本实例:
select * from urls where id < 5000
”select * from urls where id >= 5000
”您将在网络上获得更多的并发(可能不是问题)和数据库(数据库知道如何处理并发,并且使用它的2个脚本通常不会太多),但你可以在同一时间内处理几乎两倍相同数量的文件。
如果您有4个CPU,将4个中的网址列表拆分(或者更多;通过反复试验找出)部分也可以。
答案 1 :(得分:2)
由于您的查询位于一个表上且没有分组或排序,因此查询不太可能很慢。我希望问题是内容字段的大小和数量。您似乎将整个网页的HTML存储在数据库中,然后每次要更改页面上的几个值时将其拉出。如果可能的话,这是一种应该避免的情况。
大多数科学网络应用程序(例如BLAST)都可以选择将数据导出为分隔文本文件,如csv。如果是这种情况,您可以考虑重构您的url表,以便在csv中每个数据字段有一列。然后你的更新查询会明显加快,因为你可以完全在SQL中完成它们,而不是将整个url表拉入PHP,访问和拉取每个url记录的一个或多个其他记录,然后更新你的表。
可能您已将数据存储为网页,因此您可以轻松地将内容转储到浏览器。如果您按照我的建议更改数据库架构,则需要编写一个网页模板,以便在希望输出数据时插入数据。
答案 2 :(得分:1)
了解查询和表结构会更容易。
如果你不能给他们检查你是否有IN操作员。 MySQL在那里往往会放慢太多。也尝试运行
EXPLAIN yourquery;
并查看它是如何执行的。有时排序需要花费太多时间。尽量避免在非索引列上进行排序。
答案 3 :(得分:0)
内连接比左连接或右连接更快
总是加快我的查询速度,并专门考虑联接。
在你的mysql配置中查看你可以关闭的设置等
答案 4 :(得分:0)
如果您不使用索引,则可能是主要问题。还有更多优化提示和技巧。更好的是显示你最慢的查询。没有任何输入数据就无法提供帮助。索引和正确的连接可以加快这一点。
如果查询将返回相同的数据,您可以将它们存储在文件或内存中,只执行一次。
2百万条记录并不多。
答案 5 :(得分:0)
在优化之前,您需要找出瓶颈所在。您是否可以在较小的数据集上运行脚本以进行测试?
在这种情况下,您应该设置这样的测试,然后分析代码。您可以使用专用的探查器,例如Xdebug,或者如果您觉得配置太令人生畏(真的没那么复杂,但你听起来已经有点深入了),你可能会感觉更多舒适的手动方法。这意味着在部分代码之前启动计时器并在之后停止,然后打印结果。然后,您可以缩小哪个部分最慢。
一旦你得到了,我们可以提供更具体的答案,或者你可能会明白该做什么。