0

我有一个脚本,它应该通过 mysql 数据库运行并在案例上执行某个“测试”。简化后的数据库包含代表人们旅行的记录。每条记录都是一次旅行。但我只想使用往返旅行。所以我需要搜索数据库并将两次旅行相互匹配;到某个地点的旅行和从某个地点出发的旅行。

该脚本工作正常。问题是数据库包含超过 600.000 个案例。我知道如果可能的话应该避免这种情况。但是为了这个脚本的目的和以后使用数据库记录,一切都必须结合在一起。

在我的 iMac 上使用 MAMP 执行脚本时,现在执行该脚本需要几个小时。当然,我确保它可以使用大量内存等。

我的问题是如何加快速度,最好的方法是什么?

这是我现在拥有的脚本:

$table          = $_GET['table'];                  
$output = '';                  
//Select all cases that has not been marked as invalid in previous test         
$query = "SELECT persid, ritid, vertpc, aankpc, jaar, maand, dag FROM MON.$table WHERE reasonInvalid != '1' OR reasonInvalid IS NULL";         
$result = mysql_query($query)or die($output .= mysql_error());                    
$totalCountValid = '';         
$totalCountInvalid = '';         
$totalCount = '';                  
//For each record:         
while($row = mysql_fetch_array($result)){                 
    $totalCount += 1;                 
    //Do another query, get all the rows for this persons ID and that share postal codes. Postal codes revert between the two trips                 
   $persid                 = $row['persid'];                 
   $ritid                  = $row['ritid'];                 
   $pcD                    = $row['vertpc'];                 
   $pcA                    = $row['aankpc'];                 
   $jaar                   = $row['jaar'];                 
   $maand                  = $row['maand'];                 
   $dag                    = $row['dag'];         
   $thecountquery  = "SELECT * FROM MON.$table WHERE persid=$persid AND vertpc=$pcA AND aankpc=$pcD AND jaar = $jaar AND maand = $maand AND dag = $dag";                  
   $thecount               = mysql_num_rows(mysql_query($thecountquery));                 
   if($thecount >= 1){                         
      //No worries, this person ID has multiple trips attached                            
      $totalCountValid += 1;                 
   }else{                         
      //Ow my, the case is invalid!                         
     $totalCountInvalid += 1;                         
     //Call the markInvalid from functions.php                          
     $totalCountValid += 1;                          
     markInvalid($table, '2', 'ritid', $ritid);                 
   }         
}                  
//Echo the result         
$output .= 'Total cases: '.$totalCount.'<br>Valid: '.$totalCountValid.'<br>Invalid: '.$totalCountInvalid;                  echo $output; 
4

1 回答 1

2

您的基本问题是您正在执行以下操作。

1)获取所有未标记为无效的案例。
2)循环遍历步骤1)中获得的案例。

您可以轻松地将针对 1) 和 2) 编写的查询组合在一个查询中并循环遍历数据。这会加快一些事情。

还要记住以下提示。

1)选择所有列根本不是一件好事。数据通过网络遍历需要大量时间。我建议用您真正需要的所有列替换通配符。

SELECT * <ALL_COlumns>

2) 使用索引——谨慎、有效和适当。了解何时使用它们以及何时不使用它们。

3)如果可以的话,使用视图。
4) 使 MySQLslow query log能够了解您需要处理和优化哪些查询。

log_slow_queries  = /var/log/mysql/mysql-slow.log
long_query_time  = 1
log-queries-not-using-indexes 

5)使用正确的 MySQL 字段类型和存储引擎(非常非常重要)
6)使用 EXPLAIN 分析您的查询 - EXPLAIN 在 MySQL 中是一个有用的命令,它可以为您提供一些关于如何运行查询的详细信息,使用什么索引,它需要检查多少行以及是否需要进行文件排序、临时表和其他你想要避免的讨厌的事情。

祝你好运。

于 2012-07-28T09:46:51.380 回答