php + mysql用增量ID和不同值插入许多行

时间:2011-12-14 17:06:58

标签: php mysql stress-testing

我正在尝试强调我的应用程序,以查看mysql查询是否适用于大量记录。

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

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

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

如何使用增量ID和不同值将多行插入到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 个答案:

答案 0 :(得分:2)

查看Generate Data ,从中生成至少500k行的结果并将其插入到数据库中。

我建议至少500k,因为你甚至不能感觉到没有索引的查询和类似的东西。如果您只是针对10k进行测试,那么所有查询都将是快速的(索引与否)。

然后,您应该使用以下两者对您的网站进行压力测试:

Apache ab - 将加载到您的服务器(和数据库)中 MysqlSlap - 这将加载数据库

如果您在任何单个查询中遇到问题,请查看MySQL具有的EXPLAIN命令。它将确定您的问题所在。

答案 1 :(得分:1)

正如OldCode101暗示的那样,插入时不需要包含“ID_Customer”字段。如果排除它,则auto_increment生效,MySQL服务器负责分配新的唯一值。如果需要使用该值,可以使用PHP中的mysql_insert_id()函数。

回答“我如何使用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。

答案 2 :(得分:0)

只需编写一个随机函数PHP脚本来触发插入语句。不要包含插入中的ID_CUSTOMER字段,SQL Server将负责这一点。

答案 3 :(得分:0)

尝试使用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将自动上升。

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

答案 4 :(得分:0)

您还可以在SQL中创建简单的函数,如下所示

This is link to create the function

使用随机值进行for循环。

This link will explain the use of SQL RAND()

我认为这肯定会有所帮助..!