Php 从大量字符串列表中获取数据的SQL查询

Php 从大量字符串列表中获取数据的SQL查询,php,sql,mysql,database,performance,Php,Sql,Mysql,Database,Performance,我有一个很大的字符串列表(更具体地说是1500个电子邮件地址),我需要在一个非常大的数据库表中查找每个字符串的一段数据(例如主键,mydataitem)。我怎样才能有效地做到这一点 例如,这太慢了(除其他问题外): 我想避免的事情: 我不想在列表上循环并为每个项目进行选择。i、 e.1500个查询(如上例所示) 我不想在一个查询中将整个表读入一个数组,然后在代码中进行查找,因为这样会占用太多内存。DB表有100k+行 我不想用1499个ORs构建一个大型查询,因为这个查询太大了。(例如“从

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


例如,这太慢了(除其他问题外):


我想避免的事情:

  • 我不想在列表上循环并为每个项目进行选择。i、 e.1500个查询(如上例所示)
  • 我不想在一个查询中将整个表读入一个数组,然后在代码中进行查找,因为这样会占用太多内存。DB表有100k+行
  • 我不想用1499个ORs构建一个大型查询,因为这个查询太大了。(例如“
    从blah='aaa'或blah='bbb'或…
    的用户中选择mydataitem”)
注意:我使用的是MySqlv5.0.45


更新:谢谢大家-出于某种原因,我认为中的
只是用于整数ID列表-现在我知道了

但它仍然没有效率

如果您解释一下为什么需要检索这么多记录,我们也许可以想出一个更有效的逻辑

编辑


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

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

如果使用prepared语句,则可以在循环外准备语句,然后在循环内使用。这应该比每次新的mysql_查询调用运行得更快

我不知道你所说的“太大”是什么意思。试试看它有多慢

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

这听起来不像是那种经常运行的代码,所以我想如果需要一秒钟的时间也可以。如果没有,也许你可以解释一下这段代码的目标,我们可以帮助你找到更好的方法来实现这个目标

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);

除非这需要,但闪电般快,我只会使用一个MySQL in子句

将数组转换为字符串:

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

$list = "(\"". implode("\", \"", $balls) . "\")";
然后在sql中使用它

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

您的查询没有将mydataitem链接到特定的电子邮件地址.Pfff。选择mydataitem,等等,因为
blah
显然是电子邮件地址。您的查询不会将mydataitem链接到特定的电子邮件地址。您的查询不会将mydataitem链接到特定的电子邮件地址。临时表的想法非常棒。谢谢-我可能会用它!
$emails = array("abc@def.com", "123@456.net", "me@google.com");

$list = "(\"". implode("\", \"", $balls) . "\")";
$sql = "select mydataitem FROM users WHERE blah in {$list}";