mysql存儲過程批量插入
『壹』 如何提升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。
『貳』 mysql批量插入數據
不用INSERTINTO難不成用UPDATE,數據導入3000條貌似不多吧
你要這么一說,還真有點難度了,因為數據類型不一樣,還不能用數組,貌似沒有什麼絕竅
不過你可以直接用EXCEL中的CONCATENATE()函數把你的數據轉換成SQL輸入語句
然後把這個輸入語句腳本放到一個文件中,如Iinsert.sql
接著用類似下面的代碼把這個腳本導入MYSQL執行
php">!$db->select_db('databasename')&&exit($db->error());//選擇當前資料庫
if(!file_exists("./insert.sql"))exit("載入"insert.sql"失敗!");
$import_sql=file_get_contents("pms.sql",dirname(__FILE__));//打開SQL文件並讀取
$explode=explode(";",$import_sql);
$cnt=count($explode);
for($i=0;$i<$cnt;$i++){
!$db->query($explode[$i])&&exit("導入數據表失敗!");
}
echo"已建立數據表...<br><br> ";
『叄』 mysql存儲過程怎樣批量插入數據
一下代碼運行通過:
delimiter$$;
createprocerelucia_proc16(countint)
begin
DECLAREname_procVARCHAR(20)CHARACTERSETutf8;
DECLAREsex_procVARCHAR(4)CHARACTERSETutf8;
DECLAREage_procINT(10);
DECLAREclass_procVARCHAR(20)CHARACTERSETutf8;
DECLAREAddr_procVARCHAR(50)CHARACTERSETutf8;
DECLAREiINT;
seti=1;
setsex_proc='女';
setage_proc=20;
setclass_proc='山治班';
setAddr_proc='北京市朝陽區';
whilei<countdo
setname_proc=CONCAT('露西亞',i);
insertintostudents(Name,Sex,age,class,Addr)values(name_proc,sex_proc,age_proc,class_proc,Addr_proc);
seti=i+1;
endwhile;
end
$$;
delimiter;
代碼功能:
傳入一個行數,控制插入多少條數據
運行效果:
『肆』 c#中往mysql里批量插入上萬條數據,有比較高效的方法嗎
首先, 插入上萬條數據,對於資料庫來說並不是「很大」的工作量,一般配置的筆記本電腦都可以在1分鍾內完成。 所以最簡單、最靈活的辦法還是寫SQL語句。
如果不希望DB編譯器每次執行都編譯SQL的話,可以使用存儲過程,直接調用,性能上會好很多。也比較簡單。
(幾萬條數據怎麼地也得要時間去處理,所以不可能特別快的。)
如果由於各種原因,導致這個插入還是很慢, 而且你的MYSQL又是5.0以上版本的話,可以使用BulkCopy來進行批量操作。
BulkCopy的原理就是Client直接把一個數組(DataTable)傳給DB,然後傳入表名,所有的編譯、操作都由DB自己完成,效率很高。
引用MySql.Data.dll , 調用MysqlBulkCopy函數即可。
這個函數在處理海量數據插入的時候效率尤為明顯, 小量數據反而沒什麼優勢,而且由於傳入的DataTable格式必須和表的欄位一模一樣(空的列也要傳進去),導致C#要寫很多代碼來構造這個數組,所以要你自己權衡用還是不用。
我在自己的電腦上批量插入一億條數據,Insert寫法大概需要1小時,BulkCopy大概只需要5分鍾。
『伍』 mysql 怎麼用insert批量插入數據
一次插入多行數據
insert
into
表名[(欄位列表)]
values(值列表1),(值列表2),...(值列表n);
例如:
insert
into
students(sid,sname,dob)
values
('001','張三','2001-02-03'),
('002','李四','2002-02-03'),
('003','王五','2003-02-03');
將一張表或查詢中的數據插入到另一張表裡
insert
into
表名(欄位列表)
select
(欄位列表)
from
源表
where
篩選表達式;
例如將表2中的記錄全部插入到表1,假設它們的結構一樣
insert
into
表1(*)
select
*
from
表2;
『陸』 mysql資料庫如何批量插入數據,如有表A 欄位id name password email 如何插入大批量會員
1.首先在命令行控制台中打開mysql教程
或許命令的如下:
mysql -u root -p database_name
然後或許會提示輸入對應的密碼
2.下面這條命令或許對你有用,當你想更換一個資料庫姿隱教程的時候
mysql>use database_name
然後使用下面這個命令
mysql>source d:datafilename.sql
當然你並冊鍵需要將文件所在的路徑搞清楚,並且正確地使用了他
進入mysql 安裝所在的目錄的子目錄bin. 輸入執行導入sql的命令.
例如: 你的mysql 安裝在 d:mysql
步驟如下:
開始 -> 運行 -> 輸入CMD
D:
cd mysqlbin
mysql -u root -p123456 test <d:a.sql
其中 root 為你的mysql管理員用戶名, 123456 為密碼 test為資料庫名稱 d:a.sql 為備份下來的數據文件所在位置.
如果是Windows的話,從命令提示符下到MYSQL文件目錄中的Bin文件夾下,執行命令
mysql -u root -p databasename < db.sql
其中root是你MYSQL的用戶名,databasename是你資料庫的名稱,而db.sql你是的文件.注意你必須把db.sql放到bin文絕巧件夾下才可以.當然文件的位置可以換.
如果是LINUX的話,直接輸入
mysql databasename < db.sql
『柒』 怎麼用用mysql命令行快速插入一千條數據
先介紹一個關鍵字的使用:
delimiter 定好結束符為"$$",(定義的時候需要加上一個空格) 然後最後又定義為";", MySQL的默認結束符為";"
如何通過mysql命令行批量插入100條數據呢,可以在代碼里實現,也可以通過命令行,也就是通過存儲過程:
[java] view plain
delimiter $$
create procere myproc ()
begin
declare num int ;
set num = 1 ;
while num < 100 do
insert into emp (id, `name`, sex)
values
('', concat("name", num), 1) ;
set num = num + 1 ;
end
while ;
『捌』 mysql批量插入死鎖
你問的凳老是mysql批量插入死鎖的原因吧?並發操作、資料庫設計不合鄭鏈理。
1、並發操作:當多個線程同時進行批量插喊粗孫入操作時會導致並發沖突從而引起死鎖問題。
2、資料庫設計不合理:表結構設計不合理,沒有設置足夠的索引或分區會導致死鎖問題的發生。
『玖』 mysql批量插入數據怎麼寫sql語句呢
如果就一個name欄位並且ID是自增的話就這樣
INSERT INTO tablename VALUES('name1','name2','name3','name4')
否則就這樣
INSERT INTO tablename VALUES(('1','name1'),('3','name2'),('2','name3'),('8','name4'))
當然也可以這樣寫,上面的是簡化的
INSERT INTO tablename (name)VALUES ('name1','name2','name3','name4')
INSERT INTO tablename (id,name) VALUES (('1','name1'),('3','name2'),('2','name3'),('8','name4'))