加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 在两个表中插入行的最快方法是什么

发布时间:2020-12-13 17:31:01 所属栏目:PHP教程 来源:网络整理
导读:我有两个 mysql表,我想在它们中插入一封电子邮件. 我需要将电子邮件拆分为名称和域名,并将它们的每个部分插入到一个表中. 我的域表是这样的: +----+--------+| id | domain | primary(id)+----+--------+ 我的电子邮件表是: +-------+----------+| eMail |
我有两个 mysql表,我想在它们中插入一封电子邮件.

我需要将电子邮件拆分为名称和域名,并将它们的每个部分插入到一个表中.

我的域表是这样的:

+----+--------+
| id | domain | primary(id)
+----+--------+

我的电子邮件表是:

+-------+----------+
| eMail | domainId | primary key(eMail,domainId)
+-------+----------+

即:info@example.com> example.com必须在域表中插入
info必须在domainId的电子邮件表中添加.

域必须是唯一的.

我的尝试:

foreach($emails as $email)
{
    list($account,$hostname) = explode('@',$email,2);

    $query = $dbh->prepare("SELECT id FROM domain WHERE domain LIKE :domain LIMIT 0,1");
    $query->execute(array(':domain'=>trim($hostname)));

    if($query->rowCount())
    {
        $id = $query->fetch();
        $id = $id['id'];
    }else{
        $insert = $dbh->prepare("INSERT INTO domain (domain) VALUES (:domain)");
        $insert->execute(array(':domain'=>trim($hostname)));
        $id = $dbh->lastInsertId();
    }

    $name = $dbh->prepare("INSERT INTO email (eMail,domainId) VALUES (:eMail,:domainId)");
    $name->execute(array(':eMail'=>trim($account),':domainId'=>$id));
}

但是当我想添加批量电子邮件时,这种方式非常慢:

有没有更快的方法或者我可以在单个查询中执行此操作..?

解决方法

由于您有来自同一域的大量电子邮件,因此您可以尝试在本地php变量中缓存域ID,以减少对db的查询数.

此外,您应该只在循环外准备$insert和$name语句.

$domains = array();

foreach($dbh->query("SELECT id,domain FROM domain") as $domain) {
    $domains[$domain['domain']] = $domain['id'];
}

$insert = $dbh->prepare("INSERT INTO domain (domain) VALUES (:domain)");
$name = $dbh->prepare("INSERT INTO email (eMail,:domainId)");

foreach($emails as $email)
{
    list($account,2);
    $hostname = trim($hostname);

    if(!isset($domains[$hostname])) {
        $insert->execute(array(':domain'=>$hostname));
        $id = $dbh->lastInsertId();
        $domains[$hostname] = $id;
    }
    else {
        $id = $domains[$hostname];
    }    

    $name->execute(array(':eMail'=>trim($account),':domainId'=>$id));
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读