需求:多线程操作mysql时,频繁的读表写表,避免重复插入相应字段的数据条目和一些判断逻辑查和写
首先想到的是使用数据库的lock机制,涉及到数据库myisam的表级锁和innodb的行级锁性能,频繁的lock和unlock操作使并发下的mysql操作进入缓慢的等待和阻塞甚至发生死锁,所以慎用lock
与之相比的替代方案即是ON DUPLICATE KEY UPDATE利用key值冲突(primarykey和uniqueindex或者联合主键和联合索引冲突机制)将处理逻辑和负载叠加交由数据库本身做条件判断,可以实现并行线程的sql无阻塞的执行到mysql,mysql内部串行执行逻辑,甚至支持insert tab() (select from where ......) onduplicate key update col1=,col2=,col3=的复合查询结果嵌套插入和判断更新
ON DUPLICATE KEY UPDATE 语法的目的是为了解决重复性,当数据库中存在某个记录时,执行这条语句会更新它,而不存在这条记录时,会插入它。
注意点1:我们使用该语句的时候注意这条语句判断该条记录是否存在的标准是什么?由于同一个值是可以同时出现在多个记录中的,所以必须有个字段是唯一不能重复的。
注意点2:规则如果你插入的记录导致一个UNIQUE索引或者primary key(主键)出现重复,那么就会认为该条记录存在,则执行update语句而不是insert语句,反之,则执行insert语句而不是更新语句。