2014-02-28 27 views
0

即时尝试从循环中的文本文件中插入大量项目。该循环显然是它的一个while循环发送文本文件的每一行sendtodb命令。使用本地数据库非常快(190万个插入大约需要4个小时),但是在远程MySQL服务器上执行此操作时,它需要几秒钟或几周的时间来托管每秒1个插图!有什么想法吗?远程mysql嵌入表循环非常慢

private void sendtodb(string image, string title, string content, int cat) 
    { 
     string cs = @"the connection string"; 
     MySqlConnection conn = null; 
conn = new MySqlConnection(cs); 
      conn.Open(); 
     try 
     { 

      MySqlCommand cmd = new MySqlCommand("", conn); 

      cmd.CommandText = "INSERT INTO wp_posts (post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt,post_status,comment_status,ping_status,post_password,post_name,to_ping,pinged,post_modified,post_modified_gmt,post_content_filtered,post_parent, guid,menu_order,post_type,post_mime_type,comment_count) " 
       + "VALUES (@post_author, @post_date, @post_date_gmt, @post_content, @post_title, @post_excerpt,@post_status,@comment_status,@ping_status,@post_password,@post_name,@to_ping,@pinged,@post_modified,@post_modified_gmt,@post_content_filtered,@post_parent, @guid, @menu_order, @post_type, @post_mime_type, @comment_count)"; 

      // cmd.Parameters.Add("?ID", MySqlDbType.VarChar).Value = "1"; 
      cmd.Parameters.Add("@post_author", MySqlDbType.Int32).Value = 1; 
      cmd.Parameters.Add("@post_date", MySqlDbType.DateTime).Value = DateTime.Now; 
      cmd.Parameters.Add("@post_date_gmt", MySqlDbType.DateTime).Value = DateTime.Now; 
      cmd.Parameters.Add("@post_content", MySqlDbType.Text).Value = content; 
      cmd.Parameters.Add("@post_title", MySqlDbType.Text).Value = title; 
      cmd.Parameters.Add("@post_excerpt", MySqlDbType.VarChar).Value = ""; 
      cmd.Parameters.Add("@post_status", MySqlDbType.VarChar).Value = "publish"; 
      cmd.Parameters.Add("@comment_status", MySqlDbType.VarChar).Value = "open"; 
      cmd.Parameters.Add("@ping_status", MySqlDbType.VarChar).Value = "open"; 
      cmd.Parameters.Add("@post_password", MySqlDbType.VarChar).Value = ""; 
      cmd.Parameters.Add("@post_name", MySqlDbType.VarChar).Value = ""; 

      cmd.Parameters.Add("@to_ping", MySqlDbType.Text).Value = ""; 
      cmd.Parameters.Add("@pinged", MySqlDbType.Text).Value = ""; 

      cmd.Parameters.Add("@post_modified", MySqlDbType.DateTime).Value = DateTime.Now; 
      cmd.Parameters.Add("@post_modified_gmt", MySqlDbType.DateTime).Value = DateTime.Now; 
      cmd.Parameters.Add("@post_content_filtered", MySqlDbType.LongText).Value = ""; 
      cmd.Parameters.Add("@post_parent", MySqlDbType.Int32).Value = 0; 
      cmd.Parameters.Add("@guid", MySqlDbType.VarChar).Value = ""; 

      cmd.Parameters.Add("@menu_order", MySqlDbType.Int32).Value = 0; 
      cmd.Parameters.Add("@post_type", MySqlDbType.VarChar).Value = "post"; 
      cmd.Parameters.Add("@post_mime_type", MySqlDbType.VarChar).Value = ""; 
      cmd.Parameters.Add("@comment_count", MySqlDbType.Int32).Value = 0; 
      cmd.ExecuteNonQuery(); 

      cmd.CommandText = "select * from wp_posts order by ID desc LIMIT 1"; 
      MySqlDataReader dataReader = cmd.ExecuteReader(); 
      int idcolumn = 0; 
      while (dataReader.Read()) 
      { 
       idcolumn = Convert.ToInt32(dataReader["ID"]); 
      } 
      dataReader.Close(); 

      cmd.CommandText = "INSERT INTO wp_postmeta (post_id,meta_key,meta_value)" + "VALUES (@post_id,@meta_key,@meta_value)"; 

      cmd.Parameters.Add("@post_id", MySqlDbType.Int32).Value = idcolumn; 
      cmd.Parameters.Add("@meta_key", MySqlDbType.VarChar).Value = "Image"; 
      cmd.Parameters.Add("@meta_value", MySqlDbType.LongText).Value = image; 
      cmd.ExecuteNonQuery(); 

      cmd.CommandText = "INSERT INTO wp_term_relationships (object_id,term_taxonomy_id,term_order)" + "VALUES (@object_id,@term_taxonomy_id,@term_order)"; 

      cmd.Parameters.Add("@object_id", MySqlDbType.Int32).Value = idcolumn; 
      cmd.Parameters.Add("@term_taxonomy_id", MySqlDbType.Int32).Value = cat; 
      cmd.Parameters.Add("@term_order", MySqlDbType.Int32).Value = 0; 
      cmd.ExecuteNonQuery(); 


      textBox4.Text = idcolumn.ToString(); 

      textBox2.Text = "MySQL version : " + conn.ServerVersion; 

     } 
     catch (MySqlException ex) 
     { 
      textBox2.Text = ex.ToString(); 

     } 
     finally 
     { 
      if (conn != null) 
      { 
       conn.Close(); 
      } 
     } 
    } 

这是一个巨大的WordPress数据库

+0

删除了'PHP'标签。这与此无关。 – CodeAngry

+0

插入是从本地执行到远程还是本地远程?另外考虑使用'TRANSACTIONS'。可能有帮助。更何况,希望你不要连接每一个推动...我真的希望你不要和代码是错误的。 – CodeAngry

回答

0

你尝试在一个MySQL的请求插入多行?

INSERT INTO example 
    (example_id, name, value, other_value) 
VALUES 
    (100, 'Name 1', 'Value 1', 'Other 1'), 
    (101, 'Name 2', 'Value 2', 'Other 2'), 
    (102, 'Name 3', 'Value 3', 'Other 3'), 
    (103, 'Name 4', 'Value 4', 'Other 4'); 
+1

请注意超过** [Max Packet Size](http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html)**。而且,通过网络发送这样一个巨大的字符串可能会在网络层面出现错误。是否有从互联网完成1GB文件下载并被损坏?没有乐趣 – MonkeyZeus

2

您应该连接到代码之外的数据库。现在你正在做一次连接,每个连接都很低效。

的步骤应该是:

connection to database 
while(have data) { 
    use connection to insert data 
} 
disconnect from database 
+0

+1使用'ludicrously' =) – MonkeyZeus

0

由于您使用的是服务器端代码中插入你是在浪费上的连接太多时间查询,发送数据来回,你需要一个地方,SQL方解。

只需创建一个充满查询的sql文件,您需要插入由;分开的文件,然后使用SOURCE语法将其加载到mysql服务器here。这将确保以最快的方式插入这些行,因为您不会浪费任何宝贵的时间在服务器端代码上。