php - 如何加速Mysql和PHP?

标签 php sql mysql optimization

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

一些我一生需要调用一次的查询(分析数据并准备一些数据);但是需要很长时间,例如:现在我的脚本分析了一些数据超过 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:

我的查询中没有“JOIN”,甚至没有“IN”

它们是非常简单的查询

不知道!我不知道怎么知道是什么导致了缓慢?

是 PHP 还是 MYSQL?

最佳答案

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

  • 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 会有所帮助
  • (如果需要,我相信有些人将能够帮助您理解它的输出,如果您将它与您的数据库模式(表 + 索引)一起提供)
  • 如果需要:创建正确的索引——这就是硬/特定部分^^
  • 对于那些减少查询数量可能证明有用的查询也是如此...
  • 当您完成经常使用的查询时,是时候处理耗时过长的查询了;使用 microtime 来自 PHP 将帮助您找出哪些是
  • 另一种解决方案是使用 5.2.4. The Slow Query Log
  • 当您确定了这些查询时,与以前相同:优化。

  • 在此之前,要查明 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 个(甚至更多;通过反复试验找出)部分也可以。

    关于php - 如何加速Mysql和PHP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1434822/

    相关文章:

    php - 为什么在 PHP 中可以要求时包含?

    sql - MySQL - 如何简化这个查询?

    java - 如何使用html、servlet将图像插入mysql

    mysql - 在没有 super 权限的情况下在mysql中创建汉明距离函数

    mysql - 如果表中不存在列值,则将行插入表中

    php - 属性名称必须仅在 C :\xampp\htdocs\sample\vendor\yiisoft\yii2\helpers\BaseHtml. php 中包含单词字符

    php - mysql pdo 尝试将列设置为 uuid() 的值返回 "Invalid parameter number: number of bound variables does not match number of tokens"

    javascript - 将 JavaScript 代码块插入 PHP 脚本

    mysql - SQL 文本搜索 - EXACT 在空格之前,LIKE 在搜索词之后

    sql - Postgresql 应用程序插入和触发器性能