我有一个数组,我想检查用户名和电子邮件值是否存在于数据库中,如果不存在,则在数据库中插入用户名和电子邮件值。使用多个插入件,因为大约有80000个插入件需要预成型。
$arr1 = Array
(
[0] => Array ( [Username] => uname1, [Email] => email1 )
[1] => Array ( [Username] => uname2, [Email] => email2 )
[2] => Array ( [Username] => uname3, [Email] => email3 )
)发布于 2010-09-12 05:44:32
具有80000个INSERT的SQL语句的运行速度将比80000个单独的INSERT慢,因为不需要构建整体的、多INSERT的SQL语句字符串。要覆盖现有行,您将需要一个主键来确保覆盖重复的记录:http://dev.mysql.com/doc/refman/5.1/en/replace.html。
foreach ($arr1 as $user){
$sql = "REPLACE INTO `users` SET `Username`='" . mysql_escape_string($user["Username"]) . "', `Email`='" . mysql_escape_string($user["Email"]) . "'";
mysql_query($sql);
}我的代码假设Username是主键。如果不是,则添加到SET子句以包括主键。如果Username是您的主键,请考虑使用基于整数的主键,因为基于字符串的主键速度很慢。
发布于 2010-09-12 06:27:30
最简单的方法是在username+email上创建一个唯一的索引。然后,您可以直接执行插入忽略操作。尽管您可能不希望使用PHP大容量插入80000条记录,除非您还调整了超时参数。最好将其分解为批量插入,比方说每次插入500个。然后它会有很好的伸缩性。
对唯一索引使用INSERT IGNORE将只插入索引中还没有匹配的记录。不要进行单次插入和/或查找。虽然这将是规模,但它将是缓慢的。分块你的数据,它会扩展和执行的很好。
https://stackoverflow.com/questions/3692742
复制相似问题