從德爾福2010到遠程MySQL 5.09服務器的插入速度極慢,這是一個主要的問題。從Delphi遠程插入到遠程MySQL數據庫的速度非常慢
到目前爲止,我曾嘗試:用
我用配料和直接插入使用ADO(使用表MySQL的ODBC驅動程序
- ADO訪問),並與Zeos我已經使用SQL插入與查詢,然後使用表直接模式,並使用applyupdates和提交緩存更新表模式。使用MyDAC我使用表訪問模式,然後直接SQL插入,然後批量SQL插入
我試過的所有技術,我設置壓縮打開和關閉沒有可辨別的差異。
到目前爲止,我已經看到了一個全面的相同7.5記錄每秒!
現在,我想從這一點來看,假設遠程服務器速度很慢,但MySQL Workbench速度非常快,並且遷移工具包可以非常快速地管理初始遷移(說實話,我不記得有多快 - 哪種意味着它很快)
編輯1
速度會更快,我到SQL寫入文件,通過FTP上傳文件到服務器,然後將它導入直接在遠程服務器 - 我想知道他們是否會限制傳入的MySQL流量,但這並不能解釋爲什麼MySQL Workbench太快了!
編輯2
在最基本的層面上,代碼已經:
while not qMSSQL.EOF do begin qMySQL.SQL.Clear; qMySQL.SQL.Add('INSERT INTO tablename (fieldname1) VALUES (:fieldname1)'); qMySQL.ParamByName('fieldname1').asString:=qMSSQL.FieldByName('fieldname1').asString; qMySQL.ExecSQL; qMSSQL.Next; end;
我又試圖
qMySQL.CachedUpdates:=true; i:=0; while not qMSSQL.EOF do begin qMySQL.SQL.Clear; qMySQL.SQL.Add('INSERT INTO tablename (fieldname1) VALUES (:fieldname1)'); qMySQL.ParamByName('fieldname1').asString:=qMSSQL.FieldByName('fieldname1').asString; qMySQL.ExecSQL; inc(i); if i>100 then begin qMySQL.ApplyUpdates; i:=0; end; qMSSQL.Next; end; qMySQL.ApplyUpdates;
現在,這個代碼與
CachedUpdates:=False
(這顯然從來沒有真正寫回到數據庫)速度快得要命!坦率地說,我認爲這是連接 - 我感覺這是連接...只是等待他們回到我身邊!
感謝您的幫助!
如果您顯示您的代碼,檢測您的瓶頸將非常有幫助 – 2010-04-30 15:46:10
如果您使用本地服務器,插入速度有多快?也許這是一個與運輸有關的問題(連接速度慢)。 – mjn 2010-04-30 16:40:36
您的代碼不正確。設置循環外部的SQL代碼*,然後調用Prepare。在循環內只分配參數並執行,否則會失去參數的優點。在循環之外明確地開始一個事務,並在最後提交。 CachedUpdates設置爲False意味着數據直接轉到數據庫,並且不會在本地緩存。不要使用CachedUpdates,它們不是爲了速度。 – 2010-05-04 12:15:31