MySQL單表檢索

xuexiaogang發表於2021-12-11

MySQL單表檢索 自己原文公眾號: https://mp.weixin.qq.com/s/zdeU6rq3qJ6SmzDv3TNtaQ

前幾天遇到了一個問題,有個小夥伴提交了一個SQL:delete from t where trim(XXXX)<time。這句話大約要刪除3000萬條資料。幾乎是全表了。執行了1分鐘沒動靜,有人來問我要怎麼處理?我看了一下,說停止。

     這時候我覺得有必要看看需求是什麼?我們為什麼要刪除幾千萬。因為在任何關係型資料庫中delete第一不釋放空間,第二都不快(因為事務較大)。本次是MySQL、直接在監控上發現主從開始延遲。這是因為一個大事務執行的比較慢。

      這其實不怪資料庫,因為這本身是違反使用規範的。類似的使用規範在網上隨便都能查得到,我就不發表評論了。那麼一邊停止會話,一邊請提SQL的小夥伴過來一下問問為什麼要刪除?

      答案就是查詢慢了。好吧。又是一個老生常談的問題。千萬級單表查詢,Oracle、MySQL、PostgreSQL或者說是一個關係型資料庫就不可能慢。甚至可以說都差不多。(多表再說了)那麼千萬級別出現慢這種情況就幾種可能:

1、沒索引

2、索引建立的不對(順序不對)

3、條件沒用到索引(函式失效)

4、範圍過大(不如不用索引快)

    交流了一下,果然不出所料。他就想剛要最近70分鐘的資料。而SQL帶上了函式所以索引失效。刪除也是類似的。這也是常見的錯誤之一。

    那麼後來幫他按照他的需求改寫一下。執行一下16毫秒。這才是一個資料庫應該有的樣子。所以一般來說資料庫超過100毫秒的我覺得都應該介入關注一下。因為我見到過不少低於1毫秒的。

    在千萬級別的資料中進行檢索,是不會慢的。如果出現慢,請檢查執行計劃對應上面的4種常見可能性。如果進行統計分析,只要帶上合理的條件也是很快的。秒出問題不大,不需要其他等技術。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2847128/,如需轉載,請註明出處,否則將追究法律責任。

相關文章