【问题标题】:inserting new rows into SQL database将新行插入 SQL 数据库
【发布时间】:2011-11-13 10:12:40
【问题描述】:

我需要使用 C# 和 php 将新记录添加到我的 SQL 数据库中。我正在使用此代码:

string server = "http://www.naseelco.com/scorm/populatecode.php";
foreach (string code in codeList)//codelist has 200 items
 {
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(server);
     request.Method = "POST";
     string postData = "Code=" + code + "&Active=false";
     byte[] byteArray = Encoding.UTF8.GetBytes(postData);
     request.ContentType = "application/x-www-form-urlencoded";
     request.ContentLength = byteArray.Length;
     try
     {
         Stream dataStream = request.GetRequestStream();
         dataStream.Write(byteArray, 0, byteArray.Length);
         dataStream.Close();
     }
     catch
     {

     }
}

这是 populatecode.php 文件的内容:

<?php 
$Code = $_POST['Code'];
$Active = $_POST['Active'];
mysql_connect("localhost","myUserName","myPassword") or die ('Error updating database');
mysql_select_db("naseelc1_AC");
mysql_query("INSERT INTO codes (code,Active)VALUES ('$Code','$Active')");
echo $Code;
?>

但是这段代码更新 SQL 数据库的时间太长了。我的问题是:
有没有更高效的方法在 SQL 数据库中插入多条记录?

【问题讨论】:

  • 我敢肯定,每当有人要求性能优化同时对所涉及的 RDMS 保密。
  • 您可以直接从 C# 插入它们,而不是 http 发布到 php?
  • 哇——安全问题!首先,一定要使用这个:php.net/manual/en/function.mysql-real-escape-string.php
  • @Erwin:RDMS 是 MySQL,因此是 mysql_connect、mysql_select_db 和 mysql_query

标签: c# php mysql sql performance


【解决方案1】:

分析性能问题的第一件事是测试验证你在哪里浪费时间,而不是假设这是一个特殊的部分您的系统。

你说“更新 SQL 数据库花费了太多时间”,你怎么知道是 INSERT 拖慢了你的速度?

首先,您必须测量系统每个部分的运行时间。然后优化那部分。

如果您不知道要优化哪个部分,请不要开始优化。

使用分析器或简单的时间测量代码,使用 PHP 中的 microtime() 和 C# 中的 Stopwatch 类来计算程序中某个片段的运行时间,以查明热点。

假设您已经完成了所有这些操作,但仍然发现“插入一行”花费的时间太长,那么有几个领域需要探索。索引过多可能是首先要检查的内容。

看到你的程序,我敢打赌 Anders Abel 是对的,你在 HTTP 开销上浪费了时间,而不是在 INSERT 期间

另一种方法是将整个列表发送到 PHP 代码,然后使用多行 INSERT 只需一条语句即可插入所有内容:

  INSERT INTO codes (code,Active)
  VALUES 
  ('code_1', true),
  ('code_2', false),
  ('code_3', true),
  ('code_4', false),
  ('code_5', true)

但我仍然认为,您将每个代码作为一个 POST 发送到后端的概念一直在花费时间......

【讨论】:

  • OP 正在做的事情实际上并不是“为时过早”(毕竟他确实有性能问题)。但他从错误的地方开始。
  • 有效点 - 我想我应该更多地表达“不要猜测它是什么,知道它是什么!”
【解决方案2】:

200 个后续 Web 请求的延迟可能会影响性能。两个建议:

  • 更改 php 代码以接受完整列表并循环遍历它。
  • 在 C# 代码中使用 Parallel.Foreach 并行运行请求。

【讨论】:

    【解决方案3】:

    我知道您没有明确询问安全性,但转义您的用户字段!您应该永远不要直接在您的查询。您必须首先避开它们。您当前的代码很容易被利用。您可以使用 mysql_real_escape_string() 转义每个字段

    见:http://php.net/manual/en/function.mysql-real-escape-string.php

    无论如何,要真正回答您的问题,您可能需要查看MySQL Connector/NET。它是一个直接连接到 MySQL 服务器并与标准 System.Data 类集成的库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-24
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 2015-02-19
      相关资源
      最近更新 更多