比在(1,2,3 ......)中使用UserID更有效的方法

时间:2016-04-28 10:43:29

标签: sql

我有这个查询需要查询大量的ID(接近2000个)。但它根本没有效率。 (需要几秒钟)

$fp = fopen('urls.txt', 'r');  
$i =1;  
while ($url = fgets($fp)) {  
file_put_contents("album/$i.jpg", file_get_contents($url));  
$i++;  
}

所以,基本上我必须处理大量的UserID,所以处理它的方法比使用'select * from tblABC where UserID in (2,3,123... ) '

更有效。

使用Microsoft SQL

2 个答案:

答案 0 :(得分:2)

我想说你需要创建一个包含所有id并与之连接的查找表

@echo off
"C:\Program Files (x86)\PHP\v5.3\php.exe" -f C:\path_to_script\pear_web_socket_server.proc.php
Pause

答案 1 :(得分:0)

首先,返回2,000(或更多)行可能需要一些时间。如果行是宽的(每行有大量数据),则尤其如此。

其次,您应该在用于IN的列上有索引:

create index on idx_tblABC_UserId on tblABC(UserId);

第三,解析和编译长度为几十个字节的查询可能并不简单。您没有指定数据库,但可以作为考虑因素。通常,此阶段的查询处理并不重要。

第四,即使使用索引,查询引擎也可能决定进行全表扫描,具体取决于表的大小和IN列表中id的频率。

第五,如果id来自数据库,那么你不应该将它们移动到应用层来构造和IN子句。您应该在数据库中完成所有工作。

如果您在数据库中完成工作,我认为最好的查询是:

select a.*
from tblABC a
where exists (select 1 from ids where ids.UserId = a.UserId);
相关问题