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,你再试试看效果怎样?
可以将innodb_flush_log_at_commit设置成为0,将sync_binlog设置成0,你再试试看效果怎样?
解决方案:14分
你加上了 这个 WHERE id >= 0 肯定是不会有结果的,原因是你的表示空的一条记录也没有,所以加上 WHERE id >= 0 也还是0条记录,怎么insert都是空的。
本人刚才试了一下,只要0.26秒,你看看 autocommit能否为off,假如是,那就改成on:
本人刚才试了一下,只要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看看
正常缓存 1000条的插入应该在1s内,
试试开头加 SET AUTOCOMMIT=0,结束加commit看看
解决方案:4分
自动commit每次都会写redo,真正耗时的不是插入,而且每次写redo。
innodb_log_file_size 一般在1g
innodb_log_file_size 一般在1g