千家信息网

如何探讨select in 在postgresql的效率问题

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,如何探讨select in 在postgresql的效率问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在知乎上看到这样一个问题:My
千家信息网最后更新 2026年11月02日如何探讨select in 在postgresql的效率问题

如何探讨select in 在postgresql的效率问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

在知乎上看到这样一个问题:

MySQL 查询 select * from table where id in (几百或几千个 id) 如何提高效率?修改

电商网站,一个商品属性表,几十万条记录,80M,索引只有主键id,做这样的查询如何提高效率?

select * from table where id in (几百或几千个id)

这些id没啥规律,分散的。。。。

看了一下答案,感觉有好多不靠谱的,但是口说无凭,所以在我的电脑上写了几个查询测试一下。我用的是Postgresql9.4,但感觉mysql应该也差不多,首先创建一个简单表,只有简单的3列,在这个问题的下面好多人提到了需要看表的大小,其实这个问题和表大小无关,只和index的大小有关,因为是index是建立在int上的,所以只和纪录数目有关。

Table "public.t9"Column | Type | Modifiers--------+----------------+-----------c1 | integer |c2 | character(100) |c3 | character(200) |Indexes:"i1" UNIQUE, btree (c1)insert into t9 values(generate_series(1000,500000,1),repeat('a',90),repeat('b',180));

之后生成一些随机数,Mac上用jot,Linux上用shuf

for ((i=0;i<100000;i++))dojot -r 1 1000 600000 >>rand.filedone

然后根据rand.file 生成查询语句:

select * from t9 where c1 in (494613,575087,363588,527650,251670,343456,426858,202886,254037,...1);

分别生成3个sql文件,in内变量的数目分别是100,1000和10000个,执行这3个sql文件,看看时间

try psql study -f test_100.sql -o /dev/nullLOG: duration: 2.879 mstry psql study -f test_1000.sql -o /dev/nullLOG: duration: 11.974 mstry psql study -f test_10000.sql -o /dev/nullLOG: duration: 355.689 ms

可以看到只有在in内数据到了10,000个的时候数据时间会有比较大的变化,但也不过是在300多ms内完成。

那如果按照有些回答那样,先建一个临时表,然后用in subquery,并且希望这时候可以两表join呢?为了简单我直接用两表join了

drop table t_tmp;create table t_tmp(id int);insert into t_tmp (id) values(494613),(575087),(363588),(345980),...(1);select t9.* from t9, t_tmpwhere t9.c1 = t_tmp.id;

时间如何呢?

try psql study -f test_create_10000.sql -o /dev/nullLOG: duration: 2.078 msLOG: duration: 1.233 msLOG: duration: 224.112 msLOG: duration: 322.108 ms

除去drop和create的时间,依然花费了500+的时间,这里的前提还是我用的ssd盘,所以写LOG的时间会快很多。为什么会这么慢呢?用explain看一下,这时候数据量较大,直接走Merge join 了

那1000行数据的效率如何呢?

try psql study -f test_create_1000.sql -o exp.outLOG: duration: 2.476 msLOG: duration: 0.967 msLOG: duration: 2.391 msLOG: duration: 8.780 ms

100行的数据如下:

try psql study -f test_create_100.sql -o /dev/nullLOG: duration: 2.020 msLOG: duration: 1.028 msLOG: duration: 1.074 msLOG: duration: 1.912 ms

可以看到在100个值和1000个值的情况下create table的方式不会比直接在in里面写所有的变量好多少,explain看的话是在用NLJ了。但在数据量更大(按照原问题,这里in的数量其实无法预知)的情况下效率只会更低,再加上额外的表维护成本和多余的SQL语句,DBA肯定不喜欢的,还是相信数据库,放心大胆直接用in list来搞定这些问题吧。

看完上述内容,你们掌握如何探讨select in 在postgresql的效率问题的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

问题 数据 效率 时间 查询 只有 大小 生成 内容 变量 情况 感觉 数目 文件 方法 是在 更多 语句 还是 上用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 喔噻互联网科技有限公司 湖北九亚互联网络科技有限公司 广东万易互联网科技有限公司惠州分公司 互联网与科技金融数据 中国互联网科技发展 互联网科技论文 卫星互联网科技股票 现代科技和互联网有关系吗 茂名市互联网科技产业园 恒生互联网科技指数跳水 中国科技创新与世界互联网大会 佛山市拉法互联网科技有限公司 济南有互联网科技公司吗 科技互联网的核心竞争力 启辰互联网科技 张家口科技产业互联网平台 互联网的科技体现在哪里 亚光科技低轨卫星互联网 前海云享互联网科技 科技发展第三阶段互联网时代 什么是科技互联网 科技股互联网 南京欣网互联网科技 北京大学互联网科技怎么样 互联网科技寓意 佳云科技和互联网广告 宝灵互联网科技有限公司 中国科技创新与世界互联网大会 广州梦谷互联网科技有限公司领导 张家口科技产业互联网平台
0