今天在mysql上處理一個數據量達到千萬級的數據庫表時,要取出滿足條件的數據集,然后存入到mongo數據庫,使用JPA提供的Pageble去拿分頁,再用多線程去取數據時,發現剛開始效率還可以,肯定比單線程強很多,但是這個Pageable有一個問題,在生成sql語句時,會自動加上一個limit *,10000,這樣的限制條件,“*”代表從哪一行開始取數據,10000代表本次操作取10000條數據。這種操作會嚴重占用服務器的緩存,如果你在執行這種操作,別人也在訪問時,會導致大家一起都卡得一比。
解決方法就是用一個並發隊列來存儲每一頁的最后一條數據的id,但是我遇到了一個問題:
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery
limit不能和IN這樣的只是范圍的關鍵字直接連用,錯誤的sql和改進后的sql。
//出錯的sql select max(id) from news_info where id in (select id from news_info where where pub_date>?1 and id>?2 order by id limit 10000) //正確的sql select max(id) from news_info where id in (select id from (select id from news_info where pub_date>?1 and id>?2 order by id limit 10000) as news)
既然不能直接連用,那就再中間創建一個臨時表咯。
