Code Bye

存储过程插入1000条数据, 执行25.9840 秒, 感觉太慢

BEGIN
DECLARE i INT DEFAULT 0;
WHILE i<1000
DO
  INSERT INTO author(name, email) VALUES(""name"", CONCAT(""email@"",i));
SET i=i+1;
END WHILE ;
END

MySQL 返回的查询结果为空 (即零行)。 (查询花费 25.9840 秒。)
求指导释为什么这么慢….是在phpMyAdmin中执行的此存储过程…
表结构为:

CREATE TABLE IF NOT EXISTS `author` (
  `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=11512 DEFAULT CHARSET=utf8;
解决方案:2分
你的innodb_flush_log_at_commit值是多少? sync_binlog值是多少?
可以将innodb_flush_log_at_commit设置成为0,将sync_binlog设置成0,你再试试看效果怎样?
解决方案:14分
你加上了 这个 WHERE id >= 0 肯定是不会有结果的,原因是你的表示空的一条记录也没有,所以加上 WHERE id >= 0 也还是0条记录,怎么insert都是空的。
本人刚才试了一下,只要0.26秒,你看看 autocommit能否为off,假如是,那就改成on:
mysql> use world;
Database changed
mysql> CREATE TABLE IF NOT EXISTS `author` (  `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,  `name` varchar(255) DEFAULT NULL,  `email` varchar(255) DEFAULT NULL) ENGINE=InnoDB AUTO_INCREMENT=11512 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.99 sec)
mysql> delimiter $$
mysql> CREATE  PROCEDURE `author_copy_self`(IN `nThousnd` INT)
    ->     NO SQL
    -> BEGIN
    ->
    -> DECLARE i INT DEFAULT 0;
    -> SET i = 0;
    -> WHILE i < nThousnd
    -> DO
    ->   INSERT INTO
    ->   author(name,email)
    ->     SELECT name,email
    ->     FROM author
    ->     WHERE id >= 0 LIMIT 1000;
    -> SET i = i + 1;
    -> END WHILE ;
    ->
    -> END$$
Query OK, 0 rows affected (0.12 sec)
mysql> show variables like ""autocommit%""$$
+--+--+
| Variable_name | Value |
+--+--+
| autocommit    | ON    |
+--+--+
1 row in set (0.09 sec)
mysql> call author_copy_self(1000)$$
Query OK, 0 rows affected, 2 warnings (0.26 sec)
mysql> delimiter ;
mysql> select * from author;
Empty set (0.01 sec)
解决方案:4分
对于插入数据影响最大的是插入缓存。
正常缓存 1000条的插入应该在1s内,
试试开头加 SET AUTOCOMMIT=0,结束加commit看看
解决方案:4分
自动commit每次都会写redo,真正耗时的不是插入,而且每次写redo。
innodb_log_file_size 一般在1g

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明存储过程插入1000条数据, 执行25.9840 秒, 感觉太慢