代碼實踐之Job如何從MySql獲取數據

相信很多人都寫過Job,特別是對於從MySql進行大數據量(百萬級、千萬級甚至億級)的頻繁讀取,在這種場景下如何從數據庫查詢數據就不是一個簡單的問題了,查詢效率至關重要!

我們先看一下最常見也是應用最廣泛的寫法:

select * from tableName where ... limit m,n;

這種寫法對於用戶從前端讀取數據的場景下是滿足需求的,因爲m和n的值都不會很大,最多兩位數,但是對於跑Job來說卻存在隱患,想象一下,前期m還小的情況下跑着是沒問題,如果m的值增長到1千萬甚至1億了呢?對於這樣一個查詢語句,MySql會根據where條件查出1千萬+n條或者1億+n條數據,然後再取後面n條,把前面的數據全都拋棄掉,假如n=1000,你想想你爲了取這一千條數據,卻要掃描1千萬或者1億行無用的數據,這效率能高嗎?況且在Job中如果是多線程的情況下,你還不止一條線程在取這樣的數據,可能是多條線程在執行這樣的查詢,壓力山大呀!MySql很可能會崩掉哦!

危言聳聽了這麼久,也該說說解決方案了,改進寫法如下:

select * from tableName where ... and pkId > x limit n;(pkId是主鍵)

雖然說改動不大,但是效果卻千差萬別,對於這條語句來說,相當於永遠只取第一頁n條數據,而limit m的工作就由pkid>x來代替了,pkId作爲主鍵,查詢效率是極高的,整個語句的查詢效率也大大提升了!

其實如果給這篇博客換一個名字,還可以叫“limit
語句的優化方案”,這邊博客歸根結底就是對於limit語句的優化以提高查詢效率,但是使用的時候需要看是否滿足這樣查詢的潛在條件,例如是按照pkId升序查詢,如果是特殊的排序方案在進行相應改造即可!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章