我有一个数组我想检查数据库中是否存在用户名和电子邮件值,如果不存在则在数据库中插入用户名和电子邮件值。使用Multi insert,因为有大约80000个插件可以预先形成。
$arr1 = Array
(
[0] => Array ( [Username] => uname1, [Email] => email1 )
[1] => Array ( [Username] => uname2, [Email] => email2 )
[2] => Array ( [Username] => uname3, [Email] => email3 )
)
答案 0 :(得分:1)
具有80000 INSERT
s的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
是您的主键,请考虑使用基于整数的键,因为主键很慢。
答案 1 :(得分:0)
最简单的方法是在用户名+电子邮件上创建唯一索引。然后你可以做一个INSERT IGNORE。虽然您可能不希望使用PHP批量插入80000记录,除非您还调整了超时参数。最好将其分解为500个一次的批量插入。然后它会很好地扩展。
将INSERT IGNORE与唯一索引一起使用只会插入索引中尚未匹配的记录。不要进行单次插入和/或查找。虽然这会扩展,但它会很慢。数据块,它将扩展并表现良好。