0

我有一个 HTML 文本区域,我的用户可以使用它来粘贴数千个电子邮件地址。如果我想从 textarea 中消除重复的电子邮件地址,是否成本更低:

  1. 将所有电子邮件地址插入 MySQL 数据库并执行SELECT DISTINCT查询
  2. 将所有电子邮件地址加载到 PHP 数组中并执行array_unique()

谢谢!

4

3 回答 3

2

最好在每个请求的基础上处理这个问题,而不是将任意记录插入到 MySQL 表中。如果您在不知道是否重复的情况下将每条记录插入表中,您最终将不得不编写脚本来删除重复项。

例如:

假设您的文本区域在 POST 请求中包含逗号分隔的电子邮件列表

$emails = $_POST['email'];
// in real life you will want to validate each string with a regex
$emails = preg_split('/,/', $emails);
// or you could do explode(",", $emails);

// acknowledge possession of an array
$unique_emails = array();

foreach($emails as $key => $value)
{
  $unique_emails[$value] = $value;
}

// unique_emails contains all unique addresses.

现在您可以将这些插入到表中,而不必担心非唯一记录。

于 2013-10-13T02:27:56.037 回答
0

最好以 PHP 方式处理这种情况。

如果您不需要重复项,那么为什么要用不必要的数据填充数据库?

除此之外,该表已经包含一些冗余记录。因此,每次您输入冗余记录而不过滤时,表大小都会增加,因此select distinct操作变得更加耗时。因此,如果您在将记录插入数据库之前处理服务器端本身的记录冗余,那肯定会更好。

此外,由于您指定的两种方式都time-complex最好不space-complex要这样做。

于 2013-10-13T03:37:36.777 回答
0

成本更低: 将所有电子邮件地址加载到 PHP 数组中并执行array_unique()

被认为是长度为每个字符的20,000随机字符串。10

(在那些20,000随机字符串中,16,384是唯一的字符串)

Test #1 :
在上面的数组上声明了一个带有20,000随机字符串的数组 执行持续时间:
39604568481秒array_unique
0.141

Test #2 :
20,000用这些随机字符串 声明一个数组使用 PDO 准备语句在数据库表中
插入随机字符串 从表中检索 DISTINCT 随机字符串 执行持续时间:27002525 秒20,000

735.758

即使在信息发送到服务器之前,您也可以尝试从user-end(使用 Javascript 等)的 textarea 中删除重复项。
然后你也可以使用array_uniqueserver-end确保没有重复。

于 2013-10-13T10:55:59.300 回答