簡體   English   中英

將批量數據導入MySQL

[英]import bulk data into MySQL

所以我試圖將一些銷售數據導入我的MySQL數據庫。 數據最初采用原始CSV文件的形式,我的PHP應用程序需要首先處理該文件,然后將處理后的銷售數據保存到數據庫中。

最初我正在進行單獨的INSERT查詢,我意識到這是非常低效的(約6000次查詢需要大約2分鍾 )。 然后,我生成了一個大型查詢,並一次性INSERT數據。 這使我們的效率提高了3400%,並將查詢時間縮短到超過3秒

但據我了解, LOAD DATA INFILE應該比任何類型的INSERT查詢更快。 所以現在我正在考慮將處理過的數據寫入文本文件,並使用LOAD DATA INFILE將其導入數據庫。 這是將大量數據插入數據庫的最佳方式嗎? 或者我完全以錯誤的方式解決這個問題?

我知道幾千行主要是數字數據在宏觀方案中並不是很多,但我正在努力使這個內部網應用程序盡可能快速/響應。 我還想確保在我們決定將該計划授權給其他公司的情況下,此流程可以擴展。

更新:

所以我按照建議繼續測試LOAD DATA INFILE ,認為它可能只給我邊際速度增加(因為我現在將相同的數據寫入磁盤兩次),但是當它將查詢時間從超過3300ms減少時我很驚訝降至~240ms。 頁面仍然需要大約1500毫秒來執行總計,但它仍然比以前明顯更好。

從這里我想我會檢查數據庫中是否有任何多余的索引,並且,由於除了我的兩個表之外的所有表都是InnoDB,我將研究優化InnoDB緩沖池以優化整體性能。

LOAD DATA INFILE非常快,是將文本文件導入MySQL的正確方法。 根據這一點,這是加快數據插入速度提高20倍的推薦方法之一:

https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html

假設將處理后的數據寫回文本文件比將其插入數據庫更快,那么這是一個很好的方法。

LOAD DATA或多個插件比單個插件要好得多; LOAD DATA可以為您節省一點點,您可能並不在乎這么多。

在任何情況下,在一個事務中做了很多但不是太多 - 每個事務10,000行通常感覺正確(注意:這與非事務引擎無關)。 如果您的交易太小,那么它將花費所有時間將日志同步到光盤。

大部分時間進行大量插入都將來自構建索引,這是一項昂貴且占用大量內存的操作。

如果你需要表現,

  • 索引盡可能少
  • 確保表及其所有索引都適合您的innodb緩沖池(假設這里是innodb)
  • 只需添加更多內存,直到你的桌子適合內存,除非這變得非常昂貴(64G現在不是太昂貴)

如果你必須使用MyISAM,那里有一些骯臟的技巧可以讓它更好,我不會進一步討論。

伙計們,我有同樣的問題,我的需求可能比一般情況更具體,但我在這里寫了一篇關於我的發現的帖子。

http://www.mediabandit.co.uk/blog/215_mysql-bulk-insert-vs-load-data

對於我的需求,加載數據很快,但需要即時保存到平面文件意味着平均加載時間比批量插入更長。 此外,我不需要做200多個查詢,在我一次做這個之前,我現在正在填充它們,節省的時間在幾秒鍾內。

無論如何,希望這對你有幫助嗎?

你的方法應該沒問題。 我不確定LOAD DATA INFILE與批量INSERT相比有多快,但我聽到了同樣的事情,它應該更快。

當然,你需要做一些基准來確定,但我會說值得編寫一些測試代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM