我有一个 HTML 文本区域,我的用户可以使用它来粘贴数千个电子邮件地址。如果我想从 textarea 中消除重复的电子邮件地址,是否成本更低:
- 将所有电子邮件地址插入 MySQL 数据库并执行
SELECT DISTINCT
查询 - 将所有电子邮件地址加载到 PHP 数组中并执行
array_unique()
?
谢谢!
最好在每个请求的基础上处理这个问题,而不是将任意记录插入到 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.
现在您可以将这些插入到表中,而不必担心非唯一记录。
最好以 PHP 方式处理这种情况。
如果您不需要重复项,那么为什么要用不必要的数据填充数据库?
除此之外,该表已经包含一些冗余记录。因此,每次您输入冗余记录而不过滤时,表大小都会增加,因此select distinct
操作变得更加耗时。因此,如果您在将记录插入数据库之前处理服务器端本身的记录冗余,那肯定会更好。
此外,由于您指定的两种方式都time-complex
最好不space-complex
要这样做。
成本更低: 将所有电子邮件地址加载到 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_unique
来server-end
确保没有重复。