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必须在域表中插入 域必须是唯一的. 我的尝试: 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)); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |