存储过程插入1000条数据, 执行25.9840 秒, 感觉太慢!!!求指点....

lyzhlpqf 2015-09-18 02:27:25

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;
...全文
376 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobluesky 2015-09-28
  • 打赏
  • 举报
回复
自动commit每次都会写redo,真正耗时的不是插入,而且每次写redo。。。 innodb_log_file_size 一般在1g
xiaobluesky 2015-09-28
  • 打赏
  • 举报
回复
对于插入数据影响最大的是插入缓存。。 正常缓存 1000条的插入应该在1s内, 试试开头加 SET AUTOCOMMIT=0,结束加commit看看
九月茅桃 2015-09-21
  • 打赏
  • 举报
回复
你的innodb_flush_log_at_commit值是多少? sync_binlog值是多少? 可以将innodb_flush_log_at_commit设置成为0,将sync_binlog设置成0,你再试试看效果怎么样?
LongRui888 2015-09-21
  • 打赏
  • 举报
回复
你加上了 这个 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)
rick-he 2015-09-18
  • 打赏
  • 举报
回复
引用 2 楼 lyzhlpqf 的回复:
[quote=引用 1 楼 u011575570 的回复:] 你的表里有数据吗?有的话有多少?
没有数据, 表已经清空了.[/quote] 你的数据库配置怎样?innodb的buffer池市多少?
lyzhlpqf 2015-09-18
  • 打赏
  • 举报
回复

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
lyzhlpqf 2015-09-18
  • 打赏
  • 举报
回复
引用 1 楼 u011575570 的回复:
你的表里有数据吗?有的话有多少?
没有数据, 表已经清空了.
rick-he 2015-09-18
  • 打赏
  • 举报
回复
你的表里有数据吗?有的话有多少?

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧