前提是已經考慮了索引的問題,但因為數據量大導致表的增刪改查還是很慢
解決方案建議
1. 歷史數據歸檔
2. 數據分表
一. 歷史數據歸檔
1.1 方案
1. 根據時間范圍查找需要刪除的數據
2. 如果主鍵是有序的,可以根據時間范圍查找到臨界主鍵進行刪除
3. 創建臨時表,遷移數據(已歸檔數據不遷移),再修改臨時表為原表(需要停機)
-- 新建一個臨時訂單表 create table orders_temp like orders; -- 把當前訂單復制到臨時訂單表中 insert into orders_temp select * from orders where timestamp >= SUBDATE(CURDATE(),INTERVAL 1 month); -- 修改替換表名 rename table orders to orders_old rename table orders_temp to orders -- 刪除舊表 drop table orders_temp
1.2 優點
1. 對系統改動小,改造成本低
2. 可根據數據量制定歸檔周期
1.3 缺點
1. 歷史歸檔數據屬於冷數據,需要單獨查詢
2. 需要開發自動歸檔程序,並比對歸檔前后數據正確性
1.4 擴展
1. 刪除歸檔數據時,應分批刪除,減少對數據庫的壓力
2. 數據刪除僅做標記,不做實際刪除,會導致磁盤碎片。但掃描數據時,只會掃描未刪除的數據,減少掃描數據量,提高速度。
二. 數據分表
2.1 優點
1. 預估好數據量,計划好分表數的前提下,可支撐大量數據
2. 使用適合的中間件對業務無侵入
2.2 缺點
1. 存在冷熱數據不均的情況,熱表還是會有大數據問題
2. 需要研究中間件或自行開發,否則對業務侵入較大
3. 歷史數據按時間分表無需遷移數據,按其它分片鍵分表需遷移數據
2.3 擴展
1. 分表后的數據跨表整合需要中間件支持或自行開發