C 在MySQL大量資料下的高效讀取 寫入詳解

2022-09-28 19:57:13 字數 2012 閱讀 2173

前言

c#操作mysql大量資料最常見的操作便是 select 讀取資料,然後在c#中對資料進行處理, 完畢後再插入資料庫中。  簡而言之就 select -> process -> insert 三個步驟。 對於資料量小的情況下(百萬級別 or 幾百兆)可能

最多1個小時就處理完了。但是對於千萬級資料可能幾天,甚至更多。 那麼問題來了,如何優化??

第一步 解決讀取的問題

跟資料庫打交道的方式有很多,我來列舉下吧:

1. 【重**-坦克大炮】使用重型orm框架,比如 ef,nhibernat 這樣的框架。

2. 【輕**-ak47】 使用 dapper,petapoco 之類,單cs檔案。靈活高效,使用簡單。居家越貨必備(我更喜歡petapoco :))

3. 【冷兵器?匕首?】使用原生的connection、command。 然後寫原生的sql語句。。

分析:【重**】在我們這裡肯定程式設計客棧直接被pass, 他們應該被用在大型專案中。

【輕**】 dapper,petapoco 看過原始碼你會發現用到了反射,雖然使用 il和快取技術 ,但是還是會影響讀取效率,pass

好吧那就只有使用匕首, 原生sql 走起, 利用 datareader 進行高效讀取,並且使用 索引 取資料(更快),而不是列名。

大概的**如下:

using (var conn = new mysqlconnection("connection string..."))

}哈哈,怎麼樣,**非常原始,還是使用索引來取資料,很容易出錯。  當然一切為了效能咱都忍了

第二步 資料處理

其實這一步,根據你的業務需要,**肯定不一, 不過無非是一些 字串處理 , 型別轉換 的操作,這時候就是考驗你的c#基礎功底的時候了。 以及如何高效編寫正規表示式。。。

具體**也沒法寫啊 ,先看完 clr via c# 在來跟我討論吧 ,o(∩_∩)o哈哈哈~ 跳過。。。。

第三部 資料插入

如何批量插入才最高效呢?  有同學會說, 使用 事務 啊,begintransaction, 然後endtransaction。 恩,這個的確可以提高插入效率。 但是還有更加高效的方法,那就是合併insert語句。

那麼怎麼合併呢?

insert into table (f1,f2) values(1,'sss'),values(2,'bbbb'),valueswww.cppcns.com(3,'cccc');

就是把values後面的全部用逗號,鏈結起來,然後一次性執行 。

當然不能一次性提交個100mb的sql執行,mysql伺服器對每次執行命令的長度是有限制的。 通過 www.cppcns.commysql伺服器端的 max_allowed_packet   屬性可以檢視, 預設是 1mb

咱們來看看偽**吧

//使用stringbuilder高效拼接字串

var sqlbuilder = new stringbuilder();

//新增insert 語句的頭

string sqlheader = "insert into table1 (`f1`,`f2`) values";

sqlbuilder.append(sqlheader);

using (var conn = new mysqlconnection("connection string..."))

,''),", f1,addslash(f2));

if (sqlbuilder.length >= 1024 * 1024 * 1024)//當然這裡的1mb length的字串並不等於 1mb的packet。。。我知道:)}}

好了,到這裡 大概的優化後的高效查詢、插入就完成了。

總結總結下來,無非2個關鍵技術點, datareader、sql合併, 都是一些老的技術啦。其實,上面的**只能稱得上高效, 但是, 卻非常的不優雅。以上就是這篇文章的全部內容了,希望本文的內容對大家能有所幫助,如果有疑問大家可以留言交流。

本文標題: c#在mysql大量資料下的高效讀取、寫入詳解

本文位址: /ruanjian/csharp/171519.html

MySql大量資料的分頁查詢

1.直接用limit start,count分頁語句,也是我程式中用的方法 select from product limit start,count 當起始頁較小時,查詢沒有效能問題,我們分別看下從10,100,1000,10000開始分頁的執行時間 每頁取20條 如下 select from p...

大量List資料批量插入資料庫很高效的方法

下面方法適用於大量 百萬級別的list資料 插入到oracle表中 private static final int openid phone num 800 經實踐,800一批插入相對較快,這個可以隨便定義 private void insertpmesendtophoneinfo listpho...

PHP查詢MySQL大量資料的記憶體

這篇文章主要是從原理,手冊和原始碼分析在php中查詢mysql返回大量結果時,記憶體占用的問題,同時對使用mysql c api也有涉及。昨天,有同事在php討論群裡提到,他做的乙個專案由於mysql查詢返回的結果太多 達10萬條 從而導致php記憶體不夠用。所以,他問,在執行下面的 遍歷返回的my...