mysql批量更新資料庫
1. mysql 批量更新10000+的數據,有什麼效率比較高的方法
首先, 插入上萬條數據,對於資料庫來說並不是「很大」的工作量,一般配置的筆記本電腦都可以在1分鍾內完成。 所以最簡單、最靈活的辦法還是寫SQL語句。
如果不希望DB編譯器每次執行都編譯SQL的話,可以使用存儲過程,直接調用,性能上會好很多。也比較簡單。
(幾萬條數據怎麼地也得要時間去處理,所以不可能特別快的。)
如果由於各種原因,導致這個插入還是很慢, 而且你的MYSQL又是5.0以上版本的話,可以使用BulkCopy來進行批量操作。
BulkCopy的原理就是Client直接把一個數組(DataTable)傳給DB,然後傳入表名,所有的編譯、操作都由DB自己完成,效率很高。
引用MySql.Data.dll , 調用MysqlBulkCopy函數即可。
這個函數在處理海量數據插入的時候效率尤為明顯, 小量數據反而沒什麼優勢,而且由於傳入的DataTable格式必須和表的欄位一模一樣(空的列也要傳進去),導致C#要寫很多代碼來構造這個數組,所以要你自己權衡用還是不用。
我在自己的電腦上批量插入一億條數據,Insert寫法大概需要1小時,BulkCopy大概只需要5分鍾。
2. 關於mysql的批量更新
mysql數據批量更新
update a set b=1 where id in ($ids) and id !=$_GET['id'];
update a set b=0 where id not in ($ids) and id !=$_GET['id'];
3. 如何提高Mysql 批量插入和更新 資料庫的效
需要將大量數據(大概5W條)插入MySQL數
據庫,用普通的SQL
Statement執行,時間大概是幾分鍾。於是想到用PreparedStatement,但是改了之後發現效率並沒有很大的提升。不成,想到了
load data local
infile...命令,以前一直認為這條命令僅限MySQL終端上使用而不是標準的SQL語句,今天看了幾篇文章之後有了很大的收獲。
1. 使用PreparedStatement batch operation
以前使用PreparedStatement性能沒有很大提升的原因在於:
沒有使用批處理方法
在語句執行之前應關閉事務自動提交,語句執行完之後再提交
public
void batchLoad(Connection connection)
{
try
{
connection.setAutoCommit(false);
BufferedReader reader =
new BufferedReader(new
FileReader("tfacts_result"));
String sqlString =
"insert into test(node1, node2, weight) values(?, ?, ?)";
PreparedStatement pstmt = connection.prepareStatement(sqlString);
String line =
null;
while(true)
{
line = reader.readLine();
if(line == null)
{
break;
}
String[] columns = line.split("\t");
for(int
i = 1; i <= columns.length; i++)
{
pstmt.setString(i, columns[i-1]);
}
pstmt.addBatch();
}
pstmt.executeBatch();
connection.commit();
pstmt.close();
reader.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}catch
(SQLException e){
e.printStackTrace();
}catch
(IOException e){
e.printStackTrace();
}
2.使用load data local infile into tabel XXX(注意在文件中用\t將每列數據隔開)
public
void loadData(Connection connection)
{
long
starTime = System.currentTimeMillis();
String sqlString =
"load data local infile ? into table test";
PreparedStatement pstmt;
try
{
pstmt = connection.prepareStatement(sqlString);
pstmt.setString(1,
"tfacts_result");
pstmt.executeUpdate();
pstmt.close();
}
catch (SQLException e) {
e.printStackTrace();
}
long
endTime = System.currentTimeMillis();
System.out.println("program runs "
+ (endTime - starTime) + "ms");
}
測試了5W條數據,PreparedStatement耗時10s,而load data infile耗時3s。
4. mysql大量數據更新採用什麼樣的方式比較好,20w條數據一次更新
建緩沖區。比如其他類型的高速緩存(redis等)作為中間緩沖層。
數據的查詢,更改首先在這個層處理,處理完再更新到對應的資料庫。
注意額外增加鎖,或者緩存機制防止緩存擊穿,雪崩導致系統崩潰。
5. java mysql mybatis批量更新怎麼弄
Java mysql mybatis批量更新資料庫,採用以下寫法即可執行,但是資料庫連接必須配置:&allowMultiQueries=true
例如:jdbc:mysql://192.168.1.236:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
<updateid="batchUpdate"parameterType="java.util.List">
<foreachcollection="list"item="item"index="index"open=""close=""separator=";">
updatetest
<set>
test=${item.test}+1
</set>
whereid=${item.id}
</foreach>
</update>
MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始映射,將介面和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成資料庫中的記錄.
6. mysql數據批量更新,謝謝
update a set b=1 where id in ($ids) and id !=$_GET['id'];
update a set b=0 where id not in ($ids) and id !=$_GET['id'];
這樣應該可以解決你問題,怎麼把兩條語句合並,我就不清楚了,你查查