精华帖 (8) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (8)
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-17
hocus 写道 bluemeteor 写道 异常不是这么用滴!
做好索引,select count(*)来判断才是正道 我也同意 异常不应该被用于流程和业务逻辑判断 好像select count(1)效率会更高 |
|
返回顶楼 | |
发表时间: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操作不产生异常,而直接插入,并丢弃异常。 我觉得这种方案和数据库里的乐观锁的思想是一致的。 |
|
返回顶楼 | |
发表时间: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)); |
|
返回顶楼 | |
发表时间:2008-09-18
cary1130 写道 hocus 写道 bluemeteor 写道 异常不是这么用滴!
做好索引,select count(*)来判断才是正道 我也同意 异常不应该被用于流程和业务逻辑判断 好像select count(1)效率会更高 大部分情况下是一样,你可以上网搜一下,有一篇专门讲count(*)和count(1)的区别的,建议用count(*)。 |
|
返回顶楼 | |
发表时间:2008-09-19
必须加唯一约束,有的用户在大量并发时段开两个窗口,同时提交,同时查询时数据库都没有这条记录,结果在间隔非常短的时间都入库了。
|
|
返回顶楼 | |
发表时间:2008-09-19
wolfbrood 写道 vvgg 写道 设为主键,重复捕捉异常
坚决反对这种用法,异常不能这么用,每次异常都会消耗系统很多资源。 方法1:就是先把数据插入一个临时表,然后通过sql找出临时表里面哪些数据在正式表里面没有,然后把这些数据插入正式表。至于怎么找没有重复的数据那就是你的事,数据库存储过程可以完成,也可以写程序一条一条的读出。 这个方法避免了每次插入都要查找一次,但不一样的数据就要插入两次。至于效率问题你可以自己慢慢调优。 方法2:写trigger,在插入之前做一个查询,如果有就抛弃,没有就插入数据 那如果是这样一种情况: 用户注册,要判断用户名在数据库里是否存在,方法1就没有意义了 |
|
返回顶楼 | |
发表时间:2008-09-20
yunjingxinwu 写道 方法2:写trigger,在插入之前做一个查询,如果有就抛弃,没有就插入数据
这个方法比较好,很实用 每一条数据都要做一个select,和你自己写程序select然后insert区别大么? 很可怕的就是锁.... 临时表的好处就是最大程度的降低了锁的频率 |
|
返回顶楼 | |
发表时间:2008-09-20
vvgg 写道 如果是实时的这样还不如直接select count(*) 然后 insert 快 如果不实时怎么保证数据的一实时性,用户insert 以后,马上可以看到 这个过程是一个一体化过程,并没有多久之后才执行下一步的间隔 所以这个实时性不需要担心; 就像你在界面做一个插入,然后刷新提取一样;是一个连续的无间隔的动作 |
|
返回顶楼 | |
发表时间:2008-09-20
quanwei309 写道 必须加唯一约束,有的用户在大量并发时段开两个窗口,同时提交,同时查询时数据库都没有这条记录,结果在间隔非常短的时间都入库了。
这个是乐观锁的事 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |