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