我正在尝试强调我的应用程序,以查看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');
答案 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()
我认为这肯定会有所帮助..!