首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个MySQL查询与逻辑结合到数据文件中

将多个MySQL查询与逻辑结合到数据文件中
EN

Stack Overflow用户
提问于 2009-12-22 16:23:30
回答 2查看 263关注 0票数 1

背景:

我正在使用控制台的PHP脚本将330 meg xml文件解析为DB (netflix目录)。

我每3秒就可以成功地添加1,500个标题,直到添加了添加演员、类型和格式的逻辑。这些表是由关联表链接的单独表。

现在我必须按照这个顺序对每个标题运行许多很多查询(我首先截断所有表,以消除旧的标题、类型等)

  1. 将新标题添加到“title”并捕获插入id
  2. 检查执行器表
  3. 如果存在,则获取id,如果不插入参与者,则获取插入id。
  4. 在关联表中插入标题id和参与者id

(对于类型也重复步骤2-4 )

这使我的速度下降到大约每3秒10。这将需要永恒的添加~250,00标题。

因此,我如何将这4个查询合并成一个查询,而不添加重复的参与者或类型()?

我的目标是将所有查询写入数据文件,并执行批量插入。

首先,我将所有关联查询写入一个数据文件中,但这对性能影响不大。

我首先插入电子标题,并保存ID

代码语言:javascript
复制
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();
}

,然后与每个演员的名称一起使用,以创建关联

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

发布于 2009-12-22 16:48:40

你的表现异常缓慢,有些地方很不对劲。我假设如下

  • 您可以在体面的硬件上运行专用的、否则空闲的数据库服务器。
  • 您已经在某种程度上对其进行了调优(例如,至少将其配置为正确地使用了少量的ram )--引擎特定的优化将是必需的。

您可能会被许多带有自动提交的小操作所刺痛;这是一个错误,因为它会生成不合理数量的磁盘IO操作。您应该在一个事务中完成大量的工作(100,1000条记录等),然后提交它。

由于执行查询的简单开销(查询本身将非常容易,因为您将有一个关于参与者名称的索引),查找可能会减慢速度。

我还质疑您假设没有两个参与者同名的方法--您的原始数据库肯定包含一个唯一的参与者ID,所以您不会混淆它们吗?

票数 1
EN

Stack Overflow用户

发布于 2009-12-22 16:29:55

你能使用PHP以外的语言吗?如果不是,您是作为PHP独立脚本运行还是通过you服务器运行?need服务器可能会增加很多不需要的开销。

我在工作中使用Python做了非常类似的事情,每秒可以在标准的3.4GRAM、3GBRAM、机器上插入几千行(使用关联表查找)。MySQL数据库不是本地托管的,而是在局域网中托管的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1947442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档