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