我有一个脚本应该通过一个mysql数据库运行并在这些情况下预先形成一个'test'。简化数据库包含表示由人员进行的旅行的记录。每条记录都是一趟旅程。但我想只使用往返旅行。所以我需要搜索数据库并匹配彼此的两次旅行;从某个地方出发和旅行。
脚本运行正常。问题是数据库包含超过600.000个案例。我知道如果可能的话应该避免这种情况。但是为了这个脚本的目的和以后使用数据库记录,一切都必须结合在一起。
使用MAMP在我的iMac上执行时,执行脚本需要几个小时。当然,我确保它可以使用大量的内存etcetare。
我的问题是如何加快速度,最好的办法是什么?
这是我现在的剧本:
$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;
答案 0 :(得分:2)
您的基本问题是您正在执行以下操作。
1)获取所有未被标记为无效的案例。
2)循环通过步骤1)中获得的案例。
您可以轻松地将为1)和2)编写的查询组合在一个查询中并循环数据。这会加速一些事情。
还要记住以下提示。
1)选择所有列并不是一件好事。数据遍历网络需要大量时间。我建议用你真正需要的所有列替换通配符。
SELECT * <ALL_COlumns>
2)使用指数 - 谨慎,有效和适当。了解何时使用它们以及何时不使用它们。
3)如果可以,请使用视图。
4)启用MySQL slow 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中一个很有用的命令,它可以为你提供一些关于如何运行查询,使用什么索引,需要检查多少行以及是否需要执行文件的详细信息排序,临时表和其他你想避免的讨厌的东西。