我正在使用PHP和mysql在我的localhst中开发一个脚本,我正在处理大数据(大约有2百万条用于科学研究的记录)
我需要在生活中调用一些查询(分析数据并准备一些数据); 但是例如需要很长时间:现在我的脚本正在分析一些数据超过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?
首先,为了能够有效地进行优化,您需要知道花时间:
PHP做了太多的计算?
你有太多的SQL查询吗?
你有SQL查询需要花费太多时间吗?
如果是的话,哪些?
你的脚本在哪里花费时间?
有了这些信息,您可以尝试弄清楚:
如果你可以减少SQL查询的数量
例如,如果你一遍又一遍地做同样的查询,你显然是在浪费时间
另一个想法是"重新组合"查询,如果可能的话; 例如,只使用一个查询来获得10行,而不是10个查询都获得一行.
如果您可以优化花费太长时间的查询
使用索引 - 那些有用的索引通常取决于您使用的连接和条件
或重写问题,如果他们是"坏"
关于select语句的优化,你可以看一下:7.2.优化SELECT和其他语句
如果PHP进行了太多计算,你可以减少计算吗?
也许不会一次又一次地重新计算类似的东西?
或者使用更有效的查询?
如果PHP花费时间,并且SQL服务器没有过载,使用并行性(同时启动多个计算)也可能有助于加快整个过程.
仍然:这是一个非常具体的问题,答案可能也非常具体 - 这意味着如果你想要的不仅仅是一般性答案,那么可能需要更多的信息......
编辑后进行编辑
因为你只有简单的查询,事情可能会更容易......也许吧.
首先:您需要确定您正在进行的查询类型.
我猜,在你所有的查询中,你可以识别一些"类型"的查询.
例如:" select * from a where x = 12
"和" select * from a where x = 14
"具有相同的类型:相同的select,相同的表,相同的where子句 - 只有值更改
一旦您知道哪些查询被最多使用,您就需要检查它们是否已经过优化:使用EXPLAIN
会有所帮助
(如果需要,我确信有些人能够帮助你理解它的输出,如果你提供它与你的数据库(表+索引)一起提供)
如果需要:创建正确的索引 - 这是一种硬/特定部分^^
对于那些减少查询数量的查询也可能有用......
当你完成经常使用的查询时,是时候进行花费太长时间的查询了; 使用microtime
PHP将帮助您找出那些是什么
另一个解决方案是使用5.2.4.慢查询日志
当您识别出这些查询时,与之前相同:优化.
在此之前,要了解PHP是否工作太多,或者它是否是MySQL,一种简单的方法是在Linux上使用"top"命令,或者"进程管理器" (我不在Windows上,而不是在英语中使用它 - 真实姓名可能是其他的东西).
如果PHP正在吃100%的CPU,那么你就有罪魁祸首.如果MySQL正在吃掉所有的CPU,你也有罪魁祸首.
当你知道哪一个工作太多时,这是第一步:你先知道要优化什么.
我从你的代码部分看到你是:
逐个浏览10,000个元素 - 应该很容易将它们分成2个或更多个切片
使用DOM和XPath,这可能会占用PHP端的一些CPU
如果你有一个多核CPU,一个想法(我会尝试,如果我看到PHP正在吃大量的CPU)将并行化.
例如,您可以同时运行两个PHP脚本实例:
一个将处理前半部分的URL
这个的SQL查询将像" select * from urls where id < 5000
"
另一个将处理URL的后半部分
它的查询将像" select * from urls where id >= 5000
"
您将在网络上获得更多并发(可能不是问题)和数据库(数据库知道如何处理并发,并且使用它的2个脚本通常不会太多),但您将能够在同一时间处理几乎两倍于相同数量的文档.
如果你有4个CPU,将urls-list分成4个(甚至更多;通过反复试验找出)部分也会这样做.