MySQL in和limit不能連用的問題

2022-05-18 22:45:12 字數 796 閱讀 8630

今天在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)

既然不能直接連用,那就再中間建立乙個臨時表咯。

MySql IN 和 OR 效率問題

假設檢索的列為n,in 的時間複雜度為 o logn 而 or 的時間複雜度為 o n 在資料量少於100條時的情況下差別不大 當要檢索的列為主鍵索引時,in 的執行速度和 or 差別不大 當要檢索的列為普通索引時,in 的執行速度和 or 差別不大 當要檢索的列沒有索引時,in的執行速度要遠大於 ...

MySQL in和exists查詢對比

外表 tablea 內錶 tableb in select from tablea where tablea.id in select a id from tableb exists select from tablea where exists select from tableb where t...

MySQL 中子查詢是不能使用LIMIT

mysql5.1中子查詢是不能使用limit的,報錯 this version of mysql doesn t yetsupport limit in all any some subquery 這樣的語句是不能正確執行的。select from table where id in select ...