22秒是在mysql中插入500行的好时机吗?

use*_*948 3 php mysql

以下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:我知道有更好的方法来执行这个查询,但我想知道为什么这个问题太慢了.

Roc*_*mat 6

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)

  • 为什么不将“ values”串联到单个插入的字符串中呢? (2认同)

Cra*_*yne 6

而不是运行多个插入语句,而是将它们批处理并作为一个语句执行

 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)

这将大大加快您的插入速度