項目場景:
從kafka消費N條數據,每條帶有一個id,從表A中查出這N個id對應的N條記錄,繼續做其他業務
翻譯:select * from A where id in("1","2","3","4","5",..............)
這里的id是一個字符串,非數值型,N是一個可配的(比如我們一般是2000-4000),表示一次從kafka消費的條數
表A數據量:5000萬以內
數據庫:postgres 9.6
初期:直接暴力執行select * from A where id in("1","2","3","4","5",..............)查出結果,因為考慮到性能,N只給500-1000條
然而查詢很慢,嚴重影響后續整個的速度
修改一:將N個id的查詢改為200個一批查一次,每次的結果拼接后組成N條記錄
修改二:將N個id的查詢改為200個一批,開10個線程查詢,最后結果合並
這樣的查詢,速度也可以接受,但是總感覺應該還有別的方式處理in操作
於是找到了regexp_split_to_table這個函數:
SELECT * from regexp_split_to_table('111,222,333,444',',') t left JOIN A on A.id = t;
該函數將一個list轉化成一張臨時表(案列中的in的條件),與將要查詢的表做聯表查詢,左表的量相當於in條件的id個數
項目中大表量最大為8000萬,
sql實例:
select f.* from (select regexp_split_to_table(#{picIds},',')as id) as t, dw_face_feature f where t.id = f.human_pic_id
有興趣的伙伴可以放入項目中一試~~