论坛首页 Java企业应用论坛

向大数据数据库中插入值时,还要判断插入是否重复,然后插入。如何提高效率

浏览 77392 次
精华帖 (8) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (8)
作者 正文
   发表时间:2008-09-17  
hocus 写道
bluemeteor 写道
异常不是这么用滴!

做好索引,select count(*)来判断才是正道

我也同意
异常不应该被用于流程和业务逻辑判断


好像select count(1)效率会更高
0 请登录后投票
   发表时间:2008-09-18  
cary1130 写道
hocus 写道
bluemeteor 写道
异常不是这么用滴!

做好索引,select count(*)来判断才是正道

我也同意
异常不应该被用于流程和业务逻辑判断


好像select count(1)效率会更高


效率无疑是直接插入捕捉异常是最高效率的,
select 1 from TABLE where COL=somevalue limit 1 (mysql)
if RESULT_SET is empty
    insert ...

这样是避免异常的写法。但是这样会产生两次IO,而且整个操作需要锁表。

而这个时候,不妨乐观假设insert操作不产生异常,而直接插入,并丢弃异常。

我觉得这种方案和数据库里的乐观锁的思想是一致的。
0 请登录后投票
   发表时间:2008-09-18  
1. insert into _tmp;
2. insert into _table (select * from _tmp t where not exists (select 'x' from _table where _id=t._id));
0 请登录后投票
   发表时间:2008-09-18  
cary1130 写道
hocus 写道
bluemeteor 写道
异常不是这么用滴!

做好索引,select count(*)来判断才是正道

我也同意
异常不应该被用于流程和业务逻辑判断


好像select count(1)效率会更高


大部分情况下是一样,你可以上网搜一下,有一篇专门讲count(*)和count(1)的区别的,建议用count(*)。
0 请登录后投票
   发表时间:2008-09-19  
必须加唯一约束,有的用户在大量并发时段开两个窗口,同时提交,同时查询时数据库都没有这条记录,结果在间隔非常短的时间都入库了。
0 请登录后投票
   发表时间:2008-09-19  
wolfbrood 写道
vvgg 写道
设为主键,重复捕捉异常

坚决反对这种用法,异常不能这么用,每次异常都会消耗系统很多资源。

方法1:就是先把数据插入一个临时表,然后通过sql找出临时表里面哪些数据在正式表里面没有,然后把这些数据插入正式表。至于怎么找没有重复的数据那就是你的事,数据库存储过程可以完成,也可以写程序一条一条的读出。
这个方法避免了每次插入都要查找一次,但不一样的数据就要插入两次。至于效率问题你可以自己慢慢调优。

方法2:写trigger,在插入之前做一个查询,如果有就抛弃,没有就插入数据


那如果是这样一种情况:
用户注册,要判断用户名在数据库里是否存在,方法1就没有意义了
0 请登录后投票
   发表时间:2008-09-20  
yunjingxinwu 写道
方法2:写trigger,在插入之前做一个查询,如果有就抛弃,没有就插入数据


这个方法比较好,很实用

每一条数据都要做一个select,和你自己写程序select然后insert区别大么?
很可怕的就是锁....

临时表的好处就是最大程度的降低了锁的频率
0 请登录后投票
   发表时间:2008-09-20  
vvgg 写道


如果是实时的这样还不如直接select count(*)  然后 insert 快

如果不实时怎么保证数据的一实时性,用户insert 以后,马上可以看到

这个过程是一个一体化过程,并没有多久之后才执行下一步的间隔
所以这个实时性不需要担心;

就像你在界面做一个插入,然后刷新提取一样;是一个连续的无间隔的动作
0 请登录后投票
   发表时间:2008-09-20  
quanwei309 写道
必须加唯一约束,有的用户在大量并发时段开两个窗口,同时提交,同时查询时数据库都没有这条记录,结果在间隔非常短的时间都入库了。

这个是乐观锁的事
0 请登录后投票
   发表时间:2008-09-20  
goolcona 写道
1. insert into _tmp;
2. insert into _table (select * from _tmp t where not exists (select 'x' from _table where _id=t._id));

这个是上面很多一致思路的更简洁的做法了
not in就哭了,not exists不清楚,不过firebird的优化建议是不要用not in而用not exists
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics