以下php脚本大约需要22秒才能执行.这是正常的吗?如果不是什么会导致它慢慢执行?
$conn = mysql_connect('localhost', 'root', '123');
mysql_select_db('mydb', $conn);
$time1 = time();
for ($i=1;$i<500;$i++) {
mysql_query("Insert into accounts(id, username, email, password) VALUES(\"$i\", \"$i\",\"$i\",NOW())");
}
print time() - $time1; // return ~22
Run Code Online (Sandbox Code Playgroud)
编辑:表结构:
CREATE TABLE IF NOT EXISTS `accounts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`email` varchar(200) NOT NULL,
`password` varchar(20) NOT NULL,
`status` varchar(10) DEFAULT 'pending',
`email_newsletter_status` varchar(3) DEFAULT 'out',
`email_type` varchar(4) DEFAULT 'text',
`email_favorite_artists_status` varchar(3) DEFAULT 'out',
`created_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7500 ;
Run Code Online (Sandbox Code Playgroud)
此代码仅用于测试插入速度.使用Zend框架(Zend_Db的插入方法)我得到了类似的结果,所以我认为它与mysql有关而不是php代码
Edit2:我知道有更好的方法来执行这个查询,但我想知道为什么这个问题太慢了.
22秒是很长的一段时间.我的猜测是每次插入后,需要更新INDEX.
尝试将此作为交易.
mysql_query("START TRANSACTION");
for ($i=1;$i<500;$i++) {
mysql_query("Insert into accounts(id, username, email, password) VALUES(\"$i\", \"$i\",\"$i\",NOW())");
}
mysql_query("COMMIT");
Run Code Online (Sandbox Code Playgroud)
而不是运行多个插入语句,而是将它们批处理并作为一个语句执行
INSERT INTO example
(example_id, name, value, other_value)
VALUES
(100, 'Name 1', 'Value 1', 'Other 1'),
(101, 'Name 2', 'Value 2', 'Other 2'),
(102, 'Name 3', 'Value 3', 'Other 3'),
(103, 'Name 4', 'Value 4', 'Other 4');
Run Code Online (Sandbox Code Playgroud)
这将大大加快您的插入速度