created是個datetime. 本例場景是得到該條記錄創(chuàng)建了多少秒,從而與過期時間比對判斷是否過期.篩選出已經過期的記錄 拿出來操作并進行更新.
SELECT unix_timestamp()- unix_timestamp(created)  as expiredTime from t_test where id = 1
上千萬條記錄性能存不存在問題目前沒有結論。如果不行后續(xù)想有沒有更好的解決方法
很多場景都是需要我們分批取數據,避免block住庫表. 一般做法是
select * from datatable limit offset,amount這里就會有一個問題,隨著offset值的越來越大,這條sql要掃描的表數據就會越來越多,因為要定位到offset這一行就需要掃描比offset小的所有行。顯然在一張大數據量的表中,去這樣做,性能就會出問題。為了避免這樣的情形出現,我們自然會想到使用索引來解決,比如使用自增序列id進行分批取:
select * from datatable where id >= start and id<start+batchCount這樣我們對id建索引,然后分批去取,顯然效果會高很多,但是如果自增序列由于刪除等操作變得不是連續(xù),就會出現空執(zhí)行和多執(zhí)行的情況出現。要解決這個方法,我們就需要結合使用索引和分頁的優(yōu)勢來處理:
select * from datatable where id >= start limit batchCount然后每次取回來我們再計算出起始id值,再去取下一批數據。這樣就可以既避免了第一種不走索引,查詢性能低下的問題,又解決了第二種id不連續(xù),導致取回來的數據量不穩(wěn)定導致浪費的問題了。
例子: 這個查詢可能會返回10W條數據.需要分批次查詢
<!-- 篩選出在未來一天內即將過期的記錄 -->SELECT `id`, `mobile`FROM t_userWHERE id >= #{startIndex} and`status` = 1 AND( `expire_sec` - ( unix_timestamp() - unix_timestamp(`created`) )) < 86400limit 1000新聞熱點
疑難解答
圖片精選