無論采用哪種存儲系統,數據查詢的耗時取決于兩個因素
- 查找的時間復雜度
- 數據總量
查找的時間復雜度又取決于
- 查找算法
- 數據存儲結構
????????以Mysql存儲的訂單數據為例,隨著業務的發展,數據量越來越大,對一些歷史歸檔數據的查詢,如果直接從DB查詢就不太合適,比如"2021年訂單"等等。這是就適合對數據進行歸檔。
數據要歸檔到哪里呢?
根據業務的需要,可以歸檔到另外的Mysql數據庫,也可以歸檔到另外的存儲系統。比如MongoDB、ES、HBase、ClickHousse
歸檔步驟:
1. 從Mysql中查詢需要歸檔的數據
2. 將數據寫入新的存儲系統
3. 刪除原Mysql數據
歸檔過程需要關注的問題:
1. 能夠隨時暫停歸檔任務,隨時開始歸檔任務
2. 能夠記錄歸檔任務的執行狀態
3. 歸檔任務不能影響正常的業務系統, 注意避免內存溢出
3. 要保證歸檔后的數據與原數據的一致性
歸檔具體實現(以遷移到MongoDB為例):
1. 從mysql分頁查詢數據, 查詢條件有 id > ${maxOrderId}, 對應MongoDB記錄的已遷移的最大orderId.
select * from ${orderTableName} o
left join ${orderItemTableName} ot
on o.id = ot.order_id
where o.id >= #{maxOrderId} and o.gmt_create< #{gmtCreate}
order by id limit #{limit}
2. 數據寫入MongoDB, 另外,MongoDB記錄寫入的最大orderId(orderId增序), 兩個操作在一個事務中。
3. 刪除mysql遷移的這批數據
<delete id="deleteMigrateOrders">delete from ${orderTableName} oWHERE o.order_id >= #{minOrderId} and o.order_id <= #{maxOrderId}order by id</delete>
- 之所以使用orderId作為條件,因為orderid是主鍵,查詢更快.
- 為什么要增加排序呢? 因為按照ID排序后, 每批刪除的記錄基本上都是ID連續的一批記錄,
由于B+樹的有序性,這些ID相近的記錄,在磁盤的物理?件上,?致也是存放在?起的,這樣刪除效率會?較?,也便于MySQL回收?。
4.??批量刪除數據,還要注意下,執?刪除語句后,最好能停頓??會,因為刪除后肯定會牽涉到?量的B+樹??分裂和合并,這個時候MySQL的本身的負載就不?了,停頓??會,可以讓MySQL的負載更加均衡。