背景:
我正在使用控制台的PHP脚本将330 meg xml文件解析为DB (netflix目录)。
我每3秒就可以成功地添加1,500个标题,直到添加了添加演员、类型和格式的逻辑。这些表是由关联表链接的单独表。
现在我必须按照这个顺序对每个标题运行许多很多查询(我首先截断所有表,以消除旧的标题、类型等)
(对于类型也重复步骤2-4 )
这使我的速度下降到大约每3秒10。这将需要永恒的添加~250,00标题。
因此,我如何将这4个查询合并成一个查询,而不添加重复的参与者或类型()?
我的目标是将所有查询写入数据文件,并执行批量插入。
首先,我将所有关联查询写入一个数据文件中,但这对性能影响不大。
我首先插入电子标题,并保存ID
function insertTitle($nfid, $title, $year){
$query="INSERT INTO ".$this->titles_table." (nf_id, title, year ) VALUES ('$nfid','$title','$year')";
mysql_query($query);
$this->updatedTitleCount++;
return mysql_insert_id();
},然后与每个演员的名称一起使用,以创建关联
function linkActor($value, $title_id){
//check if we already know value
$query="SELECT * FROM ".$this->persons_table." WHERE person = '$value' LIMIT 0,1";
//echo "<br>".$query."<br>";
$result=mysql_query($query);
if($result && mysql_num_rows($result) != 0){
while ($row = mysql_fetch_assoc($result)) {
$value_id=$row['id'];
}
}else{
//no value known, add to persons table
$query="INSERT INTO ".$this->persons_table." (person) VALUES ('$value')";
mysql_query($query);
$value_id=mysql_insert_id();
}
//echo "linking title:".$title_id." with rel:".$value_id;
$query = " INSERT INTO ".$this->title_persons_table." (title_id,person_id) VALUE ('$title_id','$value_id');";
//mysql_query($query);
//write query to data file to be read in bulk style
fwrite($this->fh, $query);
}发布于 2009-12-22 16:48:40
你的表现异常缓慢,有些地方很不对劲。我假设如下
您可能会被许多带有自动提交的小操作所刺痛;这是一个错误,因为它会生成不合理数量的磁盘IO操作。您应该在一个事务中完成大量的工作(100,1000条记录等),然后提交它。
由于执行查询的简单开销(查询本身将非常容易,因为您将有一个关于参与者名称的索引),查找可能会减慢速度。
我还质疑您假设没有两个参与者同名的方法--您的原始数据库肯定包含一个唯一的参与者ID,所以您不会混淆它们吗?
发布于 2009-12-22 16:29:55
你能使用PHP以外的语言吗?如果不是,您是作为PHP独立脚本运行还是通过you服务器运行?need服务器可能会增加很多不需要的开销。
我在工作中使用Python做了非常类似的事情,每秒可以在标准的3.4GRAM、3GBRAM、机器上插入几千行(使用关联表查找)。MySQL数据库不是本地托管的,而是在局域网中托管的。
https://stackoverflow.com/questions/1947442
复制相似问题