вставка новых строк в базу данных SQL - PullRequest
0 голосов
/ 13 ноября 2011

Мне нужно добавить новые записи в базу данных SQL, используя C # и php.Я использую этот код:

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?

Ответы [ 3 ]

3 голосов
/ 13 ноября 2011

Первое, что нужно при анализе проблем с производительностью, - это проверить и проверить там, где вы теряете время, а не предположить , что это одна особая часть вашей системы.

Вы говорите: " занимает слишком много времени для обновления базы данных SQL ", откуда вы знаете, что вставки замедляют вас?

Сначала вы должныизмерьте время выполнения каждой части вашей системы.Затем оптимизируйте эту часть.

Не запускайте оптимизацию, если вы не знаете, какую часть оптимизировать.

Используйте профилировщик или простой код измерения времени, используя microtime() в PHP и класс Stopwatch в C #, чтобы вычислить время выполнения фрагмента в вашей программе, чтобы точно определить горячие точки.

Предполагая, что у вас естьСделав все это, вы обнаружите, что `INSERTìng одной строки занимает слишком много времени, а затем есть несколько областей для изучения.Слишком много индексов - это, пожалуй, первое, что нужно проверить.

Видя вашу программу, я бы поспорил, что Андерс Абель прав, и вы теряете время на издержках 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 на сервер, который занимает все время ...

2 голосов
/ 13 ноября 2011

Я знаю, что вы явно не спрашивали о безопасности, но БРОСИТЕ СВОИ ПОЛЬЗОВАТЕЛИ! Вы должны НИКОГДА НЕ напрямую использовать $_GET или $_POST переменные в своих запросах Вы ДОЛЖНЫ убежать от них первыми. Ваш текущий код широко открыт для эксплуатации. Вы можете выйти из каждого поля, используя mysql_real_escape_string()

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

В любом случае, чтобы ответить на ваш вопрос, вы, вероятно, захотите взглянуть на MySQL Connector / NET . Это библиотека, которая подключается напрямую к серверу MySQL и интегрируется со стандартными System.Data классами.

2 голосов
/ 13 ноября 2011

Задержка 200 последующих веб-запросов, вероятно, снижает производительность. Два предложения:

  • Измените код php, чтобы он принимал полный список, и просматривайте его.
  • Используйте Parallel.Foreach в коде C # для параллельного выполнения запроса.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...