Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php+mysql插入许多具有增量ID和不同值的行_Php_Mysql_Stress Testing - Fatal编程技术网

php+mysql插入许多具有增量ID和不同值的行

php+mysql插入许多具有增量ID和不同值的行,php,mysql,stress-testing,Php,Mysql,Stress Testing,我试图强调一下我的应用程序,看看mysql查询对于一大组记录是否合适 与许多开发人员一样,我编写了PHP/MySQL应用程序,其中包含少量记录,并在开发阶段添加了一些记录。 现在,我想知道,如果我的表中有10000或50000行,如何才能慢、正常或快地工作。当然,所有数据都在许多表格中,如客户、联系人、订单、产品、购物车等 为了实现这一点,我需要使用增量ID和不同的值复制行 现在,我知道不可能要求为所有表或数据库结构编写查询,因此,我的问题是: 如何在mysql表中插入多个具有增量ID和不同值的

我试图强调一下我的应用程序,看看mysql查询对于一大组记录是否合适

与许多开发人员一样,我编写了PHP/MySQL应用程序,其中包含少量记录,并在开发阶段添加了一些记录。 现在,我想知道,如果我的表中有10000或50000行,如何才能慢、正常或快地工作。当然,所有数据都在许多表格中,如客户、联系人、订单、产品、购物车等

为了实现这一点,我需要使用增量ID和不同的值复制行

现在,我知道不可能要求为所有表或数据库结构编写查询,因此,我的问题是:

如何在mysql表中插入多个具有增量ID和不同值的行?可以是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');

只需编写一个随机化PHP脚本来触发insert语句。请不要在插入内容中包含ID_CUSTOMER字段,SQL Server将处理该字段。

仔细查看,从中生成至少500k行结果并将其插入数据库

$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);
}
我推荐至少500k,因为低于500k,你甚至感觉不到没有索引的查询之类的东西。如果您只是针对10k进行测试,那么所有查询都将被闪电般地编入索引

然后,您应该使用以下两种方法对站点进行压力测试:

-这会将负载加载到服务器和数据库中 -这将增加数据库的负载


如果您在任何一个查询中遇到问题,请查看MySQL的命令。它将指出您的问题所在。

尝试类似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_将自动上升


不过,我确信有压力测试工具可供使用。

正如OldCode101所暗示的那样,插入时不需要包含您的ID\u客户字段。如果排除它,则自动增量生效,MySQL服务器负责分配一个新的、唯一的值。如果需要使用该值,可以使用PHP中的函数

这就回答了如何使用自动增量的问题

要使用多行对数据库进行压力测试,您应该找出一个您认为可能经常执行的查询,然后使用数据库中不同的行数对该查询计时

$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.

您还可以在SQL中创建如下简单函数

使用随机值创建一个for循环


我想这肯定会有帮助

我不明白。你在问插入值和自动增值如何不同?我喜欢这种方法。我会尝试这样做,至少对生成的数据来说是这样。我同意,但是,我也需要随机化数据。谢谢。这应该行得通,但我更喜欢弗兰基的懒惰解决方案。Generatedata.com关于应用程序的压力,我也这么认为。我有一个页面上有一个繁重的sql事务,在多个表上有多个查询。再次感谢。