我有一个很大的字符串列表( 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 mydataitem FROM users WHERE blah = 'aaa' OR blah = 'bbb' OR ...
”)注意:我正在使用 MySql v5.0.45
更新: 谢谢大家 - 由于某种原因,我认为IN
仅适用于整数ID列表 - 现在我知道的更好。
答案 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}";