1

我有一张包含大量数据的表格——它只是一列一百万个电话号码。

我正在编写一个 PHP 脚本,它将接收一个上传的数字文件,我想针对数据库运行每个数字以查看该数字是否已经存在。如果它确实存在,我只需要一个真正的返回而不需要其他数据。

我有两个主要问题:

  1. 出于性能/速度考虑,如果
    • 该列分为两列(A 列带有区号,B 列带有剩余数字)。这样我可以使用 WHERE 运行查询来查找给定号码的匹配区号,然后匹配剩余的 7 位数字?
    • 或者这与匹配整个 10 位数字没有区别吗?
  2. 测试 MySQL 表中是否存在行的最佳方法这个问题的答案是:

    SELECT EXISTS(SELECT 1 FROM table1 WHERE ...)
    

    如果我没记错的话,如果您要搜索的内容存在,那只会返回值“1”,对吗?由于我将在 PHP 中接收结果,这是最有效的方法吗?

4

5 回答 5

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 
于 2013-03-22T09:29:16.470 回答
2

出于性能原因,我会在一个查询中选择所有数字。

SELECT `numbers` FROM `phone_numbers` WHERE `number` IN('123', '456', '789')

然后您可以遍历结果并检查其中是否包含数字。如果不包含数字,则将其附加到您的插入查询中。所以你只有两个查询。一个用于选择,一个用于插入。

对于你的表现问题。您应该在存储电话号码的字段上有一个索引。

于 2013-03-22T09:18:11.673 回答
1

只是想再添加一件事,如果 IN 子句包含大条目,则索引将不起作用。在没有几个条目之后,整个表将以正常方式扫描,忽略“数字”上的索引。

出于上述原因,我更喜欢使用临时表和内部联接的@Kickstart 解决方案。

于 2013-05-01T19:09:01.713 回答
0

This is usually how I check if a searched data is stored in the table

<?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;
}
}
?>

and then this

<?php 
$input = 'test';
if(checkifexist($input))
{
// the script returned true, now do something
}
?>

all it does is count the number of results and made a conditional statement

于 2013-03-22T09:40:51.683 回答
0

我会这样做

SELECT COUNT(1) FROM table WHERE condition LIMIT 1
于 2013-03-22T09:22:44.313 回答