PG 库,查询优化。

2020-06-02 14:29:00 +08:00
 allenwuli

大佬们,我现在有一张表。表结构如下,sys_id,tm_id,int_cls,logo_array,date_updated. tm_id,有索引( btree )。logo_array(text 类型,是图片经过 numpy 转换的 np 数组,shape 是 96*96 很大)。 我现在需要根据 tm_id 取 logo_array,一次 1000 条.

sql: select * from 表名 where tm_id in ('','',....,''); -- (一千个 tm_id)

表现在有五百多万条数据,以后还有增量数据。 我现在每次取一千条要花 6-9 秒,太耗时了。取一条的话豪秒出,取一百条也要花 1 秒左右! 我在大数据量方面没有经验,请问各位大佬们有没有什么好的优化方法,提高我取数的效率。 谢过各位大佬了!

1681 次点击
所在节点    数据库
18 条回复
limboMu
2020-06-02 14:52:49 +08:00
按你的想法想要多久能取出数据啊?
allenwuli
2020-06-02 14:56:46 +08:00
@limboMu 越快越好啊,秒出结果最好了!
limboMu
2020-06-02 15:29:52 +08:00
@allenwuli 尽量把信息描述完全一些吧,比如执行环境是单机还是网络,查询计划是什么样子的。
reus
2020-06-02 15:32:00 +08:00
这还嫌慢?你取 100 条不就一秒以下了吗?
换 hash 索引可能会快一丁点
allenwuli
2020-06-02 15:44:09 +08:00
@limboMu 需要将整张表都读一次,所以我一次取一千。一轮下来还是很久的!有专门的数据库服务器。
allenwuli
2020-06-02 15:44:38 +08:00
@reus 要将表轮一遍,太耗时了。
reus
2020-06-02 15:49:20 +08:00
@allenwuli 多线程分片取
limboMu
2020-06-02 15:50:25 +08:00
@allenwuli 看一下数据库服务器的带宽吧,感觉瓶颈应该是在哪里
allenwuli
2020-06-02 15:53:54 +08:00
@limboMu 好的,谢了大佬。
allenwuli
2020-06-02 15:54:12 +08:00
@reus 谢了大佬,我试试
mahone3297
2020-06-02 16:07:07 +08:00
你说了 logo_array 很大,所以,就是要很多磁盘 io 去取,应该无法优化吧
where 条件你都已经加了索引了
allenwuli
2020-06-02 16:34:40 +08:00
@mahone3297 是啊,感觉很烦。
pmispig
2020-06-02 17:10:24 +08:00
你这个慢,要么是带宽问题,要么是 IO 问题,好像没啥优化的余地吧 0.0
你看看你取 1000 条的数据量是多大
shenjixiang
2020-06-02 17:15:28 +08:00
图片存数据库这做法不太合理啊,logo_array 建索引太浪费磁盘。如果小于 4kb 的话可以尝试一下 tm_id 和 logo_array 建立联合索引。
如果你的 tm_id 查询范围过大,可能还走不了索引
allenwuli
2020-06-02 17:34:52 +08:00
@shenjixiang 是很不合理,原始图片数据还是 base64 编码后存数据库的。我们现在做图片算法模型比对的,就将那个图片原始表同步过来,经过筛洗,不需要的 tm_id 被剔除。base64 的字段,自己解码再 numpy 转换的。用原始的更费事,更慢。现在的表少了不少数据,还不要 base64 转换 numpy 。其他没想到好的办法,这方面经验不足。
JDog
2020-06-02 17:50:56 +08:00
看表结构似乎从 SQL 方面优化已经没啥效果了,因为 logo_array 这个字段数据量太大...响应时间慢应该是卡在 IO 这块。
1.PG 缓存优化(需要加内存)
2.更换更好的 SSD(也需要花钱)
3.主从复制,读写分离(加机器 == 花钱)
shenjixiang
2020-06-02 17:51:08 +08:00
@allenwuli #7 说的多线程分片取是个好办法,可以试试,图片这种大数据本身就没有特别大的优化方式,只能在每个代码环节看看执行效率
MoYi123
2020-06-02 18:08:36 +08:00
1. 用 copy 应该比 select 性能更好。
2. 可以考虑传输或者储存的时候压缩一下
3. 根据我的经验,in (...) 在大于 200 个左右的时候可能会出现 recheck index 的现象,最好能 explain 确定一下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/677846

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX