1

我正在制作一段 PHP 代码,它接受用户 XML 输入(包含多个记录/项目,通常大约 20 到 100 个),对其进行解析,然后根据记录数据库对其进行检查。如果数据库中没有记录,PHP 脚本应该插入它。如果记录在数据库中,则脚本应丢弃用户的输入或运行该记录的更新,具体取决于用户是否选中了“替换记录”复选框。

我的问题是,哪个更快:选择确定唯一性的整个表的列,然后在 PHP 中对它们进行排序?或者,对于每条记录,执行 SELECT COUNT() FROM table WHERE name=(input name) AND region=(input region) 并查看是否有任何记录返回?

一个大 SQL 查询 + 相当多的 PHP 排序时间,还是 100 个小 SQL 查询和一个 PHP 比较?

编辑:人们一直在要求详细信息,所以:

数据库大小: 250 条记录或更少
索引列:我还没有在 YET 中放置索引,但我将在生产版本中设置名称和区域列与索引。
返回 SELECT 的格式:如果我执行大 SELECT,由于我使用的 DB 类 (WPDB),它将在行对象的关联数组中返回。 什么构成唯一性:名称和区域列确定记录是否唯一。如果名称-区域组合不在数据库中,则该记录是唯一的。

例如,name:"Paris" region:"France"name:"Paris" region:"Texas"是两个唯一记录。但是,name:"Paris" region:"France"name:"Marseilles" region:"France"也是如此。

4

2 回答 2

0

我会先选择整个数据库,然后创建一个数组并使用 in_array() 进行检查。

$array = array();
$query = .......
while ($row = mysql_fetch_assoc($query)) {
  array[] = $row['id'];
}
foreach ($xml_array as $line) {
   if (in_array($line['id'], $array)) {
       ##ALREADY in database
       if (<other condition>) {
            #UPDATE THE ROW
       }
   }
   else {
      ##INSERT INTO DATABASE
   }
}

当然,在我的示例中,我使用“id”作为列,但您可以使用任何内容。

祝你好运!

于 2012-07-26T00:15:16.103 回答
0

使用“REPLACE INTO”更快。语法与“INSERT INTO”完全相同,但如果有任何非唯一值由于索引(主键或唯一索引)而必须唯一,则现有记录将被替换。无需提前查询,一键查询。

请注意,替换将替换整个记录。如果您只想更新一个字段,然后运行“INSERT INTO ... ON DUPLIACTE KEY UPDATE field=value”,这将插入新记录或更新现有记录。还是一个查询。

至于另一部分(如果选中复选框,则删除记录)),只需运行“DELETE”,如果记录不存在,它将不会被删除 - 再次,一个查询。

这样,您就不会冒险在支票和更新之间添加/删除记录,而且您可以保存查询,而且其他人更容易阅读正在发生的事情。

于 2012-07-26T00:15:41.347 回答