mysql大量量挿入データの4つの方法
3479 ワード
mysql大量量挿入データの4つの方法
方法1:ループ挿入
これも最も一般的な方法で、データ量が大きくなければ使用できますが、毎回データベースに接続するリソースを消費します.大体の思考は以下の通りです(私はここで偽コードを書いて、具体的な編纂は自分のビジネスロジックあるいはフレームワークの文法と結びつけて編纂することができます)
あまりにも普通で難易度もなく、今日主に書いたものではないので、ここではあまり言いません.
方法2:接続資源を減らし、sqlをつなぐ
疑似コードは次のとおりです.
このように正常に1万件挿入する基本的な問題は大きくありません.データが長い限り、普通のロット挿入に対応するのに十分です.例えば、ロット生成カード番号、ロット生成ランダムコードなどです.
方法3:ストレージ・プロシージャの使用
これは私がちょうどこれを使ってsqlを出して、具体的な業務ロジックはみんなで自分で組み合わせてもいいです.
これもただのテストコードで、具体的なパラメータはみんな自分で定義して私はここで1回に8万本挿入して、多くありませんが、すべてのデータの量はすべてとても大きくて、多くのvarchar 4000とtextフィールドが6.524 sかかります
方法四:MYSQL LOCAL_を使用するINFILE
これは私が今使っているので、ついでにpdoのコードも復元して、皆さんの参考にします.
これは同じように各データ量が大きく、varchar 4000とtextフィールドが2.160 s以上かかり、基本的なニーズを満たしていることが多く、100万データの問題は大きくありません.データが大きすぎても、ライブラリのサブテーブルに関連しているか、キューを使用して挿入されています.
コード貼り付けでは実行できないと言われるかもしれません.私の偽のコードは思考が自分の思考があってこそ通じることができると言っています.
方法1:ループ挿入
これも最も一般的な方法で、データ量が大きくなければ使用できますが、毎回データベースに接続するリソースを消費します.大体の思考は以下の通りです(私はここで偽コードを書いて、具体的な編纂は自分のビジネスロジックあるいはフレームワークの文法と結びつけて編纂することができます)
for($i=1;$i<=100;$i++){
$sql = 'insert...............';
//querysql
}
foreach($arr as $key => $value){
$sql = 'insert...............';
//querysql
}
while($i <= 100){
$sql = 'insert...............';
//querysql
$i++
}
あまりにも普通で難易度もなく、今日主に書いたものではないので、ここではあまり言いません.
方法2:接続資源を減らし、sqlをつなぐ
疑似コードは次のとおりです.
// arr key , php
$arr_keys = array_keys($arr);
$sql = 'INSERT INTO tablename (' . implode(',' ,$arr_keys) . ') values';
$arr_values = array_values($arr);
$sql .= " ('" . implode("','" ,$arr_values) . "'),";
$sql = substr($sql ,0 ,-1);
// INSERT INTO tablename ('username','password') values
('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx')
.......
//querysql
このように正常に1万件挿入する基本的な問題は大きくありません.データが長い限り、普通のロット挿入に対応するのに十分です.例えば、ロット生成カード番号、ロット生成ランダムコードなどです.
方法3:ストレージ・プロシージャの使用
これは私がちょうどこれを使ってsqlを出して、具体的な業務ロジックはみんなで自分で組み合わせてもいいです.
delimiter $$$
create procedure zqtest()
begin
declare i int default 0;
set i=0;
start transaction;
while i<80000 do
//your insert sql
set i=i+1;
end while;
commit;
end
$$$
delimiter;
call zqtest();
これもただのテストコードで、具体的なパラメータはみんな自分で定義して私はここで1回に8万本挿入して、多くありませんが、すべてのデータの量はすべてとても大きくて、多くのvarchar 4000とtextフィールドが6.524 sかかります
方法四:MYSQL LOCAL_を使用するINFILE
これは私が今使っているので、ついでにpdoのコードも復元して、皆さんの参考にします.
// pdo MYSQL_ATTR_LOCAL_INFILE
/*[email protected]
public function pdo_local_info ()
{
global $system_dbserver;
$dbname = '[email protected]';
$ip = '[email protected]';
$user = '[email protected]';
$pwd = '[email protected]';
$dsn = 'mysql:dbname=' . $dbname . ';host=' . $ip . ';port=3306';
$options = [PDO::MYSQL_ATTR_LOCAL_INFILE => true];
$db = new PDO($dsn ,$user ,$pwd ,$options);
return $db;
}
//
public function test(){
$arr_keys = array_keys($arr);
$root_dir = $_SERVER["DOCUMENT_ROOT"] . '/';
$my_file = $root_dir . "[email protected]/sql_cache/" . $order['OrderNo'] . '.sql';
$fhandler = fopen($my_file,'a+');
if ($fhandler) {
$sql = implode("\t" ,$arr);
$i = 1;
while ($i <= 80000)
{
$i++;
fwrite($fhandler ,$sql . "\r
");
}
$sql = "LOAD DATA local INFILE '" . $myFile . "' INTO TABLE ";
$sql .= "tablename (" . implode(',' ,$arr_keys) . ")";
$pdo = $this->pdo_local_info ();
$res = $pdo->exec($sql);
if (!$res) {
//TODO
}
@unlink($my_file);
}
}
これは同じように各データ量が大きく、varchar 4000とtextフィールドが2.160 s以上かかり、基本的なニーズを満たしていることが多く、100万データの問題は大きくありません.データが大きすぎても、ライブラリのサブテーブルに関連しているか、キューを使用して挿入されています.
コード貼り付けでは実行できないと言われるかもしれません.私の偽のコードは思考が自分の思考があってこそ通じることができると言っています.