天天看點

提高資料加載速度的常用方法

資料加載是資料庫應用開發和測試中經常遇到的需求場景。如果要加載的資料量很大,加載的性能往往會成為瓶頸。最近又遇到了一個典型的資料加載場景,順手總結一下相關的經驗。

綜合來看,提高加載速度的辦法主要有:

1.     表定義中避免采用操作代價較高的資料類型,例如在允許的情況下用 integer 或 double 代替 decimal。

2.     延遲進行限制或完整性檢查,例如在資料加載之後再建立索引和外碼限制等。

3.     針對性的做一些實體參數調優,例如調整資料庫頁面的大小或充滿度。

這一類的優化需要修改資料庫設計或專門進行參數調整,可行性受到一定的限制。

1.     如果采用的是 insert 語句來加載資料,可以每插入一批記錄作為一個事務,通過減少事務數來提高速度。

2.     如果是 mysql 等允許在 insert 的 values 之後出現多行的資料庫,可以在每個 insert 語句中提供一批資料。

3.     采用伺服器端的 prepare 和

execute 語句避免每次都要解析 insert 語句,也可以提高加載效率。

這一類的優化集中在資料加載的業務邏輯上,隻要允許修改應用程式都可以采用。

1.     應用開多個連接配接并行地給資料庫加載資料。

2.     利用資料庫内部實作的功能來并行加載資料。

前者也是修改資料加載的業務邏輯,并行的加載不同的表比較容易實作。如果遇到了個别特别大的表,需要結合業務邏輯并行的加載該表的不同部分。 後者以來資料庫内部的并行加載能力,一般來說對資料加載方式會有一些限制,例如采用專門的 api 或 sql 文法。

1.     不通過資料庫引擎,直接産生符合格式的資料庫檔案。資料庫檔案的格式通常都比較複雜,不過有些資料庫可以直接讀取 csv 等常見的檔案格式。

2.     不通過 insert 之類的 sql,采用

load file 之類的指令直接加載檔案,或直接采用存儲引擎的 api。

3.     如果可以確定加載的資料是符合限制的,可以在加載前關掉限制檢查,加載之後再打開。

4.     不寫或少寫日志,例如事務日志、binlog

日志。不過,萬一加載過程中當機了,存在資料損壞的風險。

這一類的優化往往依賴産品的具體特性,可移植性較差。關閉限制檢查、不寫事務日志等開關又存在導緻資料損壞或不一緻的風險,非特殊情況都不建議使用。

tpc-c 資料加載程式為例,通常可以直接采用的優化手段有:

1.     在資料加載之後再建立索引等限制。開源的 sql

中通常都不帶外碼限制,可以進一步提高加載速度。

2.     并行加載不同的倉庫對應的資料。在

tpc-c 的業務模型中,不同倉庫的資料是可以獨立加載的。

3.     并行加載不同的表的資料。tpc-c

的表可以分為幾組互不相關的集合,并行進行加載。

4.     采用“批量加載資料”一節中的各種方法實作資料加載程式。