想象一下,您有一个“用户”表,其中包含100,000条记录,您需要按ID查找3000个项目。
通过
进行查询会更快Select * from users where id IN (2,5,30,89,...) # 3000 items
还是将这3000个项目存储在另一个表中并执行子查询会更快,例如:
Select * from users where id IN (select distinct id from lookuptable)
# lookuptable contains the 3000 records
还是完全一样?谢谢!
答案 0 :(得分:0)
找出答案的最佳方法是在有效的数据集上使用解释分析。 sql explain 它将向您显示查询执行时间和查询路线。
查询优化器可能会根据表大小,数据库设置,内存设置等使用不同的技术。
如果查找表仅包含3000条记录,那么您不需要在其上进行区分,如果它很大,并且具有更多的记录,并且可以创建3000条唯一的记录,则第一个解决方案可能会更快。
答案 1 :(得分:0)
在PostgreSQL中,最快的方法是创建查找表并进行如下查询:
$sql = "UPDATE info SET YES/NO = '$_POST[value]' WHERE ID = '$_POST[id]'";
答案 2 :(得分:0)
我已经根据需求创建了一个数据库,并且已经对其进行了测试。 从“计时”的角度来看,确实没有什么区别,但这也许是因为我的测试沙箱环境。
无论如何,我已经“解释”了这些树查询:
1- select * from users where id in (1,2,3,4,5,6,7,8,9,10,..3000)
cost:“对用户使用users_pkey进行索引扫描( cost = 4.04..1274.75行= 3000 width = 11)”“索引条件:(id = ANY('{1,2,3 ,4,5,6,7,8,9,10(...)“
2- SELECT * FROM users AS u WHERE EXISTS (SELECT 1 FROM lookuptable A-- l WHERE u.id = l.id);
<-请注意,我已经删除了'distinct',它没有用。
费用:“合并半联接(费用 = 103.22..364.35行= 3000宽度= 11)”
“合并条件:(u.id = l.id)”
“->使用用户u上的users_pkey进行索引扫描(成本 = 0.29..952.68行= 30026宽度= 11)”
“->使用用户u上的users_pkey进行索引扫描(成本 = 0.29..952.68行= 30026宽度= 11)”
3- Select * from users where id IN (select id from lookuptable)
“合并半联接(成本 = 103.22..364.35行= 3000宽度= 11)”
“合并条件:(users.id = lookuptable.id)”
“->使用用户上的users_pkey进行索引扫描(成本 = 0.29..952.68行= 30026宽度= 11)”
“->仅索引在lookuptable上使用lookuptable_pkey进行扫描(成本 = 0.28..121.28行= 3000宽度= 4)”
最后两个查询的解释图:
无论如何,正如我从上面的一些评论中看到的那样,您还必须在查询的开销中增加填充lookuptable的开销。 而且您必须将“查询”拆分为不同的执行,这可能会导致“交易问题”。 我将使用第一个查询。