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