mysql插入多条数据

下载一定要设昵称 2010-12-28 10:31:52
现有三个表,A,B,C,表C是A和B之间的关联表,程序中操作以后,可能在表C中同时插入几十条数据,
1普通的单条插入,性能会很低
2程序里面这样写(insert into C(NAME) values ('name'); insert into C(NAME) values ('name'); ...),这样能减少打开和关闭数据库连接的时间,但跟数据库交互的数据还是很多
3用存储过程,然后用序列化或者数组的方式,把参数传给mysql,这个Mysql本身好像不支持,不知道怎么搞

前两个方法不考虑了,能不能帮我出出主意,数据库表能否做优化或者有没有其它方法或者教我这样的存储过程怎么写,谢谢
...全文
1964 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yun3948 2010-12-30
  • 打赏
  • 举报
回复
五楼果然高人啊
liyiteng2010 2010-12-29
  • 打赏
  • 举报
回复
楼上太NB了!
rucypli 2010-12-28
  • 打赏
  • 举报
回复
如果是innodb存储引擎
set autocommit = 0
小小小小周 2010-12-28
  • 打赏
  • 举报
回复
用INSERT DELAYED ... 插入行被排入队列,当表没有被其它线程使用时,此行被插入。

使用INSERT DELAYED的另一个重要的好处是,来自许多客户端的插入被集中在一起,并被编写入一个块。这比执行许多独立的插入要快很多。
  • 打赏
  • 举报
回复
楼上的方法我也看过,也是需要IO操作,如果数据量只有100条,新建个txt感觉也么必要
wwwwb 2010-12-28
  • 打赏
  • 举报
回复
数据写入TXT中,用LOAD DATA INFILE导入
nkliwenjian 2010-12-28
  • 打赏
  • 举报
回复
纠正楼主一些问题:
1. 你说的第二种方法比第一种方法并不会减少打开和关闭数据库连接的时间。第一种方法完全是可以在一个数据库连接里面来实现的。
2. 如果有100条数据的话,那么这100条数据的内容是无论如何都要传到数据库里面的,这部分时间节省不了,同样的,写到硬盘的时间也节省不了
3. 完整的数据库操作流程主要流程包括:建立连接,数据传输,sql优化,数据写入,事务提交,断开连接。所以实际上你这种情况可以优化的地方不外乎数据传输,sql优化,事务提交这三部分
4. 数据传输最简单的办法就是把程序服务器和数据库服务器放在一个机器上面,至于千方百计的缩短sql大抵不必,因为本身这个环节如果排除网络因素的话,占的时间很少
5. sql优化部分,就是说自己先把sql优化了,省得服务器再做一次。这个对于select语句作用比较大。像楼主这种问题最简单的就是使用mysql的prepared statement,具体自己查文档了
6. 事务部分,一个是放在同一个事务里面来处理,另外一个是确认这个表到底是否需要使用事务,如果不需要的话就不要用innodb,这样会快很多
lrjt1980 2010-12-28
  • 打赏
  • 举报
回复
insert into 表名s (a,b,c)selct d,e,f from 表名a
iihero 2010-12-28
  • 打赏
  • 举报
回复
insert into C(NAME) values('abc'), ('abc1'), ,,,,
可以一条insert语句,插入多条记录。
ACMAIN_CHM 2010-12-28
  • 打赏
  • 举报
回复
有更好的方法的可能性很小。
  • 打赏
  • 举报
回复
其实我觉得5楼的方法不错,继续期待高招,谢谢各位了
甲壳虫 2010-12-28
  • 打赏
  • 举报
回复
为了提高插入数据的效率,我们可以利用MySql的批量插入数据能力。其实,从本质来说也就是取消JDBC中事务的自动提交,改为手动提交。
如果没有关闭JDBC事务的自动提交,那么JDBC驱动会在每次执行了一条SQL语句之后,自动提交,并且关闭连接。而我们知道打开数据库连接是非常耗资源的,而且有些JDBC框架还会限制数据库操作的频率。这种情况下,如果采用单调数据插入效果非常不好。
解决的方法之一,就是关闭JDBC事务的自动提交,改为手动提交。我们可以记录SQL语句的执行次数,然后当达到某一个值的时候,比如10w次的时候,手动提交一下事务,然后关闭并重新开始数据库连接。再进行下一批数据局的插入或者更新。
ACMAIN_CHM 2010-12-28
  • 打赏
  • 举报
回复
程序里面这样写( insert into C(NAME) values ('name1'),('name2'),('name3'),('name4'),('name5');)

56,685

社区成员

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

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