1、实际需求:user表中,phone,username这两个字段都是唯一的,不能重复。批量插入之前需要分别判断这两个字段在数据库中是否已经存在。
2、当前解决方案:使用or来实现
SELECT
COUNT(*)
FROM
USER
WHERE
phone = #{phone}
OR username = #{username}
3、问题:但是因为数据量比较大,效率很低,请问有什么更合适的解决方案,提供思路即可,谢谢。
1、实际需求:user表中,phone,username这两个字段都是唯一的,不能重复。批量插入之前需要分别判断这两个字段在数据库中是否已经存在。
2、当前解决方案:使用or来实现
SELECT
COUNT(*)
FROM
USER
WHERE
phone = #{phone}
OR username = #{username}
3、问题:但是因为数据量比较大,效率很低,请问有什么更合适的解决方案,提供思路即可,谢谢。
我今天下午用mysql+navicat试了一下,100w条数据,
总共6组结果
1、无索引,union,平均0.7s
2、无索引,or,平均0.4s
3、两个唯一性索引,union,平均0.1s
4、两个唯一性索引,or,平均0.08
5、一个联合索引,union,平均0.4s
6、一个联合索引,or,平均0.4s
SELECT
COUNT(*)
FROM
(
SELECT
*
FROM
USER
WHERE
phone = "496066"
UNION
SELECT
*
FROM
USER
WHERE
username = '888888'
) aa;
SELECT
COUNT(*)
FROM
USER
WHERE
phone = '496066'
OR username = '888888';
前提:唯一索引
1、replace into 有,先删除再插入;无,直接插入。会有id间隙
2、insert ignore into 有,id空出来;无,插入。会有id间隙。
3、insert into on duplicate key update 有,则更新;无,则插入。
第二种第三种都用过,喜欢第三种,希望你也喜欢!
15 回答8.4k 阅读
8 回答6.2k 阅读
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
可以直接用mysql的 insert on duplicate key 来解决
https://dev.mysql.com/doc/ref...
你可以选择当唯一索引重复时,忽略插入或者删除