如何加快Mysql和PHP的速度?

时间:2009-09-16 18:52:18

标签: php sql mysql optimization

我正在使用PHP和mysql在我的localhst中开发一个脚本,我正在处理大量数据(大约有两百万条用于科学研究的记录)

我需要在生活中调用一次查询(分析数据并准备一些数据);但是例如需要很长时间:现在我的脚本正在分析一些数据超过4小时

我知道我的数据库优化可能会遇到一些问题我不是专家

例如,我发现“索引”对于加速查询非常有用 然而,即使索引某些列,我的脚本仍然很慢

任何想法如何加速我的脚本(在PHP和MySQL中)

我使用XAMPP作为服务器包

非常感谢您的帮助

最好的问候

更新1:

我的慢速脚本的一部分,处理时间超过4小时

$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?

6 个答案:

答案 0 :(得分:12)

首先,为了能够有效地进行优化,您需要知道花时间:

  • PHP做了太多计算吗?
  • 你有太多的SQL查询吗?
  • 你有SQL查询需要花费太多时间吗?
    • 如果是,哪些?
  • 你的脚本在哪里花费时间?

根据这些信息,您可以尝试找出:

  • 如果可以减少SQL查询的数量
    • 例如,如果你一遍又一遍地做同样的查询,你显然是在浪费时间
    • 另一个想法是“重新组合”查询,如果可能的话;例如,只使用一个查询来获得10行,而不是10个查询都获得一行。
  • 如果您可以优化花费太长时间的查询
    • 使用索引 - 那些有用的索引通常取决于您正在使用的联接和条件
    • 或重新编写查询,如果它们是“坏”
    • 关于select语句的优化,您可以查看:7.2. Optimizing SELECT and Other Statements
  • 如果PHP进行了太多计算,你可以减少计算量吗?
    • 也许不会一次又一次地重新计算类似的东西?
    • 或使用更有效的查询?
  • 如果PHP花费时间,并且SQL服务器没有过载,使用并行性(同时启动多个计算)也可能有助于加快整个过程。

仍然:这是一个非常具体的问题,答案可能也非常具体 - 这意味着如果你想要的不仅仅是一般的答案,那么可能需要更多的信息.​​..


编辑后编辑

由于您只有简单的查询,事情可能会更容易......也许。

  • 首先:您需要确定您正在进行的查询类型。
    • 我猜你在所有查询中都可以识别一些“类型”的查询。
    • 例如:“select * from a where x = 12”和“select * from a where x = 14”属于同一类型:相同的选择,相同的表,相同的where子句 - 只有值更改
  • 一旦您知道哪些查询被最多使用,您就需要检查它们是否已经过优化:使用EXPLAIN将有助于
    • (如果需要,我确信有些人能够帮助您理解其输出,如果您将其与DB的模式(表格+索引)一起提供)
    • 如果需要:创建正确的索引 - 这是一种硬/特定部分^^
    • 对于那些减少查询数量的查询也可能有用......
  • 当您完成经常使用的查询时,是时候查询耗时过长的查询了;使用PHP中的microtime将帮助您找出它们是哪些


在此之前,要了解PHP是否运行得太多,或者它是否是MySQL,一种简单的方法是在Linux上使用“top”命令,或者使用“进程管理器”(我不在Windows上,以及不要用英语 - 实名可能是其他的东西)

如果PHP正在吃100%的CPU,那么你就有罪魁祸首。如果MySQL正在吃掉所有CPU,你也有罪魁祸首。

当你知道哪一个工作太多时,这是第一步:你知道首先要优化什么。


我从你的代码部分看到你是:

  • 逐个浏览10,000个元素 - 应该很容易将它们分成2个或更多个片段
  • 使用DOM和XPath,这可能会占用PHP端的一些CPU

如果你有一个多核CPU,一个想法(如果我看到PHP占用大量CPU,我会尝试)将并行化。

例如,您可以同时运行两个PHP脚本实例:

  • 将处理前半部分网址的人
    • 此查询的SQL查询将类似于“select * from urls where id < 5000
  • 和另一个将处理URL的后半部分
    • 其查询将类似于“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,或者如果您觉得配置太令人生畏(真的没那么复杂,但你听起来已经有点深入了),你可能会感觉更多舒适的手动方法。这意味着在部分代码之前启动计时器并在之后停止,然后打印结果。然后,您可以缩小哪个部分最慢。

一旦你得到了,我们可以提供更具体的答案,或者你可能会明白该做什么。