7

以下のようなデータベーステーブルがあります。

create table temperature
(id int unsigned not null auto_increment primary key,
temperature double
);

そして、私のプログラムでは、テーブルに挿入する約 2000 万の温度を取得しました。私は.Net環境で働いており、MySqlに接続するConnector/Netを使用しています。以下のようなコードでした。

List<double> temps = new List<double>();
...
string connStr = "server=localhost;user=name;database=test;port=3306;password=*****;";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
    conn.Open();

    //temps.Count is about 20 million
    for (int i = 0; i < temps.Count; i++)
    {
        string sql1 = "INSERT INTO temperature VALUES (null, "+temps[i]+")";
        MySqlCommand cmd1 = new MySqlCommand(sql1, conn);
        cmd1.ExecuteNonQuery();
    }

}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}
conn.Close();

非常に多くの行データをできるだけ早く挿入するにはどうすればよいですか? (私のコンピューターでは毎分 2000 レコードしか挿入できません。)

4

4 に答える 4

8

一括挿入を最適化するには、いくつかの方法があります。いくつかは次のとおりです。

  • LOAD DATA INFILE. .NET 用のラッパー API があります。これは最速の方法ですが、単純な挿入とはいくつかの制限とセマンティクスの違いがあります。

  • 複数行INSERTステートメント:

    INSERT INTO temperature (temperature) VALUES (1.0), (2.0), (3.0), ...

    一度に 20.000.000 行を挿入するべきではありませんが、1.000 ~ 10.000 行を挿入すると、非常に高速になります。これは、速度を上げるための簡単で非常に問題のない方法です。多くの場合、10 倍、場合によってはそれ以上の係数が可能です。

  • テーブルをロックしています ( LOCK TABLES)。

  • インデックスを一時的に無効にします。

  • MySQL オプションの調整。

  • INSERT DELAYED(おそらくここではあまり役に立ちません)。

ドキュメントには、オプションに関するより詳細な詳細が記載されています。一部のオプションは、テーブルの種類 ( InnoDBMyISAM )によって異なります。

一般的な提案: の前に挿入する列を常に指定しますVALUES。これにより、より保守しやすいコードが作成されます。

于 2013-02-15T10:20:43.247 に答える
6

bulk insert同時に多くの挿入を実行するという概念を使用して、ExecuteNonQuery複数回呼び出すオーバーヘッドを最小限に抑えることができます。

MySQL では、これは と呼ばれますLOAD DATA。詳細については、こちらを確認してください: http://dev.mysql.com/doc/refman/5.5/en/load-data.html

MS SQL Server ではこれが呼び出さbulk insertれ、そのように知られているため、この名前で言及しました。

于 2011-12-12T13:20:54.643 に答える
2

一括挿入を行う必要があります。それを行う ADO.NET の方法は、DataAdapterを使用することです。

MySQL 固有のソリューションについては、MySqlBulkLoaderを使用してください。

于 2011-12-12T13:28:32.297 に答える
1

一般的なルール :-

  1. ロードデータインファイルを使用
  2. インポート中にキーを無効にし、すべてのデータがインポートされた後に有効に戻します
  3. データベースサーバー自体でスクリプトを実行し、tcp/ip の代わりにソケットを使用して接続します

ほとんどのヒントはドキュメントで説明されています。

于 2011-12-12T13:25:49.100 に答える