我正试图强调我的应用程序,看看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');
查看Generate Data,从那里生成至少500k行结果并将它们插入到您的数据库中。
我建议至少500k,因为少于500k,你甚至不能感觉到没有索引的查询和类似的东西。如果你只是在10k上测试它,所有的查询都将是闪电般的快(无论是否索引)。
你应该使用这两种方法对你的网站进行压力测试:
Apache ab -这将把加载到您的服务器(和db)
MysqlSlap -将加载到数据库
如果您碰巧在任何单个查询中遇到问题,请查看MySQL的EXPLAIN
命令。
正如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 .
只需编写一个随机生成器PHP脚本来触发插入语句。不要在insert中包含ID_CUSTOMER字段,SQL Server会处理的。
试试在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
将自动上升。
您还可以在SQL中创建如下的简单函数
创建函数
创建一个for循环,使用随机值。
这个链接将解释SQL RAND()的使用
我想这肯定会有帮助…!