检查mySQL中现有条目的最佳方法是什么? (简单的表结构,大量数据)

时间:2013-03-22 09:10:04

标签: php mysql

我有一张大量数据表 - 它只是一百万个电话号码中的一列。

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

我有两个主要问题:

  1. 对于性能/速度的考虑,它是否会产生影响
    • 该列被分解为两个(带有区号的列A,带有剩余数字的列B)。这样我可以使用WHERE运行查询来查找给定数字的匹配区号,然后匹配剩余的7位数?
    • 或者与匹配整个10位数没有区别吗?
  2. 这个问题的答案Best way to test if a row exists in a MySQL table是:

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

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

5 个答案:

答案 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
}
?>

所有这一切都是计算结果数量并作出条件陈述