用于从大型字符串列表中获取数据的SQL查询

时间:2010-07-20 21:17:32

标签: php sql mysql database performance

我有一个很大的字符串列表( 1500个电子邮件地址更具体),我需要在一个非常大的数据库表中为每个字符串查找一段数据(例如主键mydataitem )。我怎样才能有效地做到这一点?


例如,这太慢了(以及其他问题):

$stringArray = ('foo','bar','baz',..., 'for 1000s of items');

foreach($stringArray as $mystring) {
    $res = mysql_query("select mydataitem,blah FROM users WHERE blah = '$mystring'");
    $info=mysql_fetch_assoc($res);
    ...
}

我想避免的事情:

  • 我不想遍历列表并为每个项目执行SELECT。即1500个查询(,如上例
  • 我不想在一个查询中将整个表读入数组并在代码中进行查找,因为它会占用太多内存。数据库表有100k +行。
  • 我不想用1499 OR构建一个大型查询,因为查询太大了。 (例如“select mydataitem FROM users WHERE blah = 'aaa' OR blah = 'bbb' OR ...”)

注意:我正在使用 MySql v5.0.45


更新: 谢谢大家 - 由于某种原因,我认为IN仅适用于整数ID列表 - 现在我知道的更好。

5 个答案:

答案 0 :(得分:2)

mysql_query("select mydataitem,blah FROM users WHERE blah IN ('"
    .implode("','",array_map('mysql_real_escape_string',$stringArray)."')';

更好的是,使用可以使用预准备语句的mysqli或PDO:

$stmt = $PDO->prepare('select mydataitem,blah FROM users WHERE blah IN ('
  .implode(',',array_fill(0,count($stringArray),'?')).')';
$stmt->execute($stringArray);

答案 1 :(得分:1)

WHERE blah IN ('aaa','bbb',...)

但它仍然效率不高。

如果你解释为什么需要检索这么多记录,我们或许可以提出一个更有效的逻辑。

修改

创建一个包含这些值的临时表,并在选择查询中使用该临时表的连接

答案 2 :(得分:1)

我认为你想要的是

SELECT mydataitem FROM users WHERE blah IN ('foo', 'bar', 'baz', ...)

答案 3 :(得分:1)

如果您使用预准备语句,则可以在循环外准备它,然后在循环中使用它。这应该比每次新的mysql_query调用运行得更快。

我不知道你的查询是“太大”是什么意思。试一试,看看它有多慢。

如果您还没有密钥,请在电子邮件字段中添加密钥。

这听起来不像经常运行的那种代码,所以如果需要一秒钟,我猜它可以。如果没有,也许您可​​以解释此代码的目标,我们可以帮助您找到实现该目标的更好方法。

答案 4 :(得分:1)

除非这需要快速闪电,否则我只会在子句中使用MySQL

将数组转换为字符串:

$emails = array("abc@def.com", "123@456.net", "me@google.com");

$list = "(\"". implode("\", \"", $balls) . "\")";

然后在你的sql中使用它

$sql = "select mydataitem FROM users WHERE blah in {$list}";