我有一张大量数据表 - 它只是一百万个电话号码中的一列。
我正在处理一个PHP脚本,它将接收一个上传的数字文件,我想对数据库运行每个数字以查看该数字是否已存在。如果确实存在,我只需要一个真实的返回而没有其他数据。
我有两个主要问题:
这个问题的答案Best way to test if a row exists in a MySQL table是:
SELECT EXISTS(SELECT 1 FROM table1 WHERE ...)
如果我没有弄错的话,那只会返回值" 1"如果您要搜索的内容存在,对吗?由于我将在PHP中收到结果,这是最有效的方法吗?
答案 0 :(得分:3)
如果数字很小(并且总是很小),那么只需使用IN即可。
如果数字可能很大,那么我会将它们加载到临时表中,并在该临时表和现有表之间进行JOIN。使用内连接只会返回匹配的记录,并且很容易返回数字和true。
如果您正在处理数以千计的数字: -
创建临时表(可能使用该号码作为唯一键)。 使用数字加载临时表。 针对现有表加入临时表: -
SELECT a.phoneNumber
FROM ExistingNumbers a
INNER JOIN SomeTempTable b
ON a.phoneNumber = b.phoneNumber
这将为您提供表格中已存在的所有数字的列表。
如果您希望列出表中尚不存在的所有数字(可能是您希望在进一步处理后添加它们): -
SELECT b.phoneNumber
FROM SomeTempTable b
LEFT OUTER JOIN ExistingNumbers a
ON a.phoneNumber = b.phoneNumber
WHERE a.phoneNumber IS NULL
答案 1 :(得分:2)
出于性能原因,我会在一个查询中选择所有数字。
SELECT `numbers` FROM `phone_numbers` WHERE `number` IN('123', '456', '789')
然后您可以迭代结果并检查其中是否包含数字。如果未包含数字,则将其附加到插入查询。所以你只有两个问题。一个用于选择,一个用于插入。
针对您的表现问题。你的领域应该有一个索引,用于存储电话号码。
答案 2 :(得分:1)
只是想再添加一个东西,如果IN子句包含大型条目,索引将无效。在几个条目之后,将以正常方式扫描整个表格,忽略“数字”上的索引。
出于上述原因,我更倾向于使用临时表和内连接的@Kickstart解决方案。
答案 3 :(得分:0)
我会这样做
SELECT COUNT(1) FROM table WHERE condition LIMIT 1
答案 4 :(得分:0)
这通常是我检查搜索数据是否存储在表格中的方式
<?php
function checkifexist($value){
$link = mysql_connect("localhost", "root", "password");
mysql_select_db("database", $link);
$result = mysql_query("SELECT column FROM table where column='".$value."' ", $link);
$num_rows = mysql_num_rows($result);
if($num_rows > 0)
{
return true;
}
else
{
return false;
}
}
?>
然后这个
<?php
$input = 'test';
if(checkifexist($input))
{
// the script returned true, now do something
}
?>
所有这一切都是计算结果数量并作出条件陈述