一、背景
今天技術交流群裡,段段同學提了一個不錯的問題。
描述如下:
假設一條記錄包含以下資訊:(id,username,score,version),score每次變更,version就加1,對于username相同的資料,隻有version最大的那一條是有效的,也就是Mysql按字段分組取最大值記錄問題,怎麼做才能使查詢效率高呢
存在的問題:
加 version 之後查詢最新的用子查詢效率不高;
建個額外的表記錄id 和 version 然後聯查,這種做法怪怪的,顯然效率也不夠高。
二、 讨論出幾個方案
2.1 加标記
方案1:加上标記字段,标記是否為最新記錄,這樣單獨查曆史還是查詢所有最新記錄都可以。
不符合單一職責原則,一個表表達兩種含義,一個是訂單記錄,一個是訂單曆史。
2.2 方案2:加曆史表
方案2:新增訂單曆史表,記錄帶版本号的記錄,另外還是維護一張主表用于查詢最新的記錄。
這樣兩種含義的記錄分開維護,邏輯更清晰。
資料有一定的備援,但是思路清晰。
2.3 方案3 用 HBase
方案3:訂單表存到 HBase裡,預設查出最新的一條,可以根據版本号查詢所有,而且資料量大也沒壓力(不需要去做分庫分表)。
問題是引入了新的中間件。
采用第二種方案。
三、方法比結果更重要,授人以魚不如授人以漁
我們知道了上面的方案還不夠,通過這個讨論,我們學到了什麼,對我們以後有啥幫助?
下面總結幾點:
1 事出詭異必有妖,即如果發現一個方案很複雜,很奇怪,估計設計出了問題。
2 将未知問題轉化為已知問題是常見解決問題的方法。可以将該問題轉化為“标記删除”問題,就簡單多了。
3 僅僅設計出實作功能的方案還不夠,要考慮是否便于維護,便于拓展,友善測試等。
4 設計方案就是不斷地取舍的過程,空間換時間也是常見的性能優化思路,适當的資料備援有時候也很有必要。
最後歡迎大家探讨工作中遇到的難點,分享工作中遇到的坑,共同進步。
另外,如果大家有更好的方案和建議,歡迎留言讨論。
全面講解性能優化的文章:
https://blog.csdn.net/w605283073/article/details/107589987創作不易,如果本文對你有幫助,歡迎關注、點贊、評論,你的鼓勵是我創作的最大動力。