一组很长的数据在向一个很大的表中做插入操作时,如何有效率地判断要插入的数值是否与数据库中已有的值重复了?假设这个表的字段比较多,只有一个id是unqiue的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
可以使用hash.
方案:
假设该表有10个字段,1个是unique的主键,你可以在插入字段时将要比较重复的其他字段(这里我们假设是其他9个字段)连成字符串,取 hash 值,放进缓存(数据量比较小的话可以考虑 memcached, 比较大的话可以考虑 Redis),用 hash->id 存储。这样,在插入新数据的时候,只要把要比较的字段按照相同的方式连起来取 hash值,到缓存里找一下,就可以很快找到是否有相同的了,有的话,再取出 id,到数据库中取出整条数据。
本方案的缺陷就是额外使用了缓存。如果没有条件的话,可以稍加改进。再建一个表,里面只有两个字段, hash 和 id,这个表专门用来做这个功能。想必比比较9个字段要快得多吧。
$str = $f1 . $f2 . $f3 ... . $f9; // 如果有非字符串类型,安全起见可以考虑转一下类型
$hash = md5($str);
// 从 redis 或其他数据库中取出,如果为空,就保存,如果有,做其他操作
$rs = $redis->get($hash);
if(!$rs){
// code for saving
// 保存完别忘了把这条记录插入缓存
$redis->set($hash, $id);
}else{
// return to frontend
}