php + mysql для вставки множества строк с инкрементными идентификаторами и разными значениями - PullRequest
2 голосов
/ 14 декабря 2011

Я пытаюсь убедить свое приложение, чтобы убедиться, что запросы mysql в порядке для большого набора записей.

Как и многие разработчики, я написал приложение PHP / MySQL с небольшим диапазоном записей идобавив пару из них на стадии разработки.Теперь мне интересно, как это будет работать (медленно, нормально или быстро), если у меня будет 10000 или 50000 строк в моих таблицах.Конечно, все данные находятся во многих таблицах (клиенты, контакты, заказы, продукты, корзины и т. Д.)

. Для этого мне нужно будет дублировать строки с инкрементными идентификаторами и различными значениями.

ТеперьЯ знаю, что невозможно попросить написать запросы для всех моих таблиц или структуры базы данных, поэтому мой вопрос:

Как я могу вставить в таблицу mysql несколько строк с инкрементными идентификаторами и разными значениями?Может быть как в стиле SQL, так и в PHP-коде настолько, насколько это возможно.

CREATE TABLE `customers` (
  `ID_Customer` int(11) unsigned NOT NULL auto_increment,
  `Name` varchar(50) character set latin1 default NULL,
  `Address` varchar(100) character set latin1 default NULL,
  `City` varchar(50) character set latin1 default NULL,
  `Zip` varchar(15) character set latin1 default NULL,
  `ID_Country_Subdivision_ISO_Code` char(3) character set latin1 default NULL,
  `ID_Country_ISO_Code` char(2) character set latin1 default NULL,
  PRIMARY KEY  (`ID_Customer`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;


INSERT INTO `customers` VALUES ('9', 'Bernard Dusablon', '8-125 103 E Avenue', 'St-Jérôme', 'J7Y 3Z6', 'QC', 'CA');
INSERT INTO `customers` VALUES ('10', 'Nicolas Gilbert', '9-125 103 E Avenue', 'Montréal', 'H7C 1T5', 'QC', 'CA');

Ответы [ 5 ]

2 голосов
/ 14 декабря 2011

Загляните в Генерируйте данные , оттуда сгенерируйте как минимум 500 000 результатов строк и вставьте их в свою базу данных.

Я рекомендую, по крайней мере, 500 000, потому что меньше, чем вы, вы даже не сможете чувствовать неиндексированные запросы и тому подобное. Если вы просто протестируете его на 10k, все запросы будут молниеносно (проиндексированы или нет).

Затем вы должны стресс-тестировать свой сайт, используя оба:

Apache ab - это загрузит ваш сервер (и дБ)
MysqlSlap - это загрузит базу данных

Если у вас возникли проблемы с каким-либо одним запросом, взгляните на команду EXPLAIN, которая есть в MySQL. Он определит, где ваша проблема.

1 голос
/ 14 декабря 2011

Как подсказал OldCode101, вам не нужно включать поле "ID_Customer" при вставке.Если вы исключите его, то auto_increment вступит в силу, и сервер MySQL будет отвечать за назначение нового уникального значения.Если вам нужно использовать это значение, вы можете использовать функцию mysql_insert_id () из PHP.

Это ответ на вопрос «Как использовать auto_increment».

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

$q_insert = "INSERT INTO customers (Name, Zip) VALUES ('%s', '%s')";
$q_test = "SELECT COUNT(*) FROM customers WHERE ZIP LIKE '%s')";

$i = 0;
while ($i++ < 10) {
  $n = 0;
  for ($n=0; $n<10000; $n++) {
    $randomname = substr(md5(time()),0,rand(5,10)) ." ". substr(md5(time()),10,rand(5,10));
    mysql_query(sprintf($q_insert, $randomname, rand(10000,99999)));
  }
  $starttime=microtime(1);
  mysql_query(sprintf($q_test, rand(1,9)));
  printf("i=%s, duration=%.4f s\n", $i, microtime(1)-$starttime);
}

Не проверено.YMMV.

0 голосов
/ 14 декабря 2011

Вы также можете создать простую функцию в SQL следующим образом

Это ссылка для создания функции

создать цикл for со случайными значениями.

Эта ссылка объяснит использование SQL RAND ()

Думаю, это наверняка поможет ..!

0 голосов
/ 14 декабря 2011

Попробуйте что-то вроде в PHP

$max_stress_test = 100;
for(i=0;i<=$max_stress_test;i++)
{
  $query = 'INSERT INTO `customers` (Name, Address, Zip, ID_Country_Subdivision_ISO_Code, ID_Country_ISO_Code) VALUES ('Bernard Dusablon', '8-125 103 E Avenue', 'St-Jérôme', 'J7Y 3Z6', 'QC', 'CA');'

  $result = mysql_query( $query ) or die( mysql_error() );
}

Он будет зацикливаться и добавлять строки в вашу таблицу, пока не достигнет 100. ID_Customer автоматически повысится.

Я уверен, что есть инструменты для стресс-тестирования, которые можно использовать.

0 голосов
/ 14 декабря 2011

Просто напишите PHP-скрипт рандомизатора, чтобы запустить оператор вставки.НЕ ВКЛЮЧАЙТЕ поле ID_CUSTOMER в вставку, об этом позаботится SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...