鍍金池/ 問答/Java  數(shù)據(jù)庫/ 怎樣實現(xiàn),一次查詢多個參數(shù),分別判斷是否都是唯一的

怎樣實現(xiàn),一次查詢多個參數(shù),分別判斷是否都是唯一的

1、實際需求:user表中,phone,username這兩個字段都是唯一的,不能重復。批量插入之前需要分別判斷這兩個字段在數(shù)據(jù)庫中是否已經(jīng)存在。
2、當前解決方案:使用or來實現(xiàn)

SELECT
    COUNT(*)
FROM
    USER
WHERE
    phone = #{phone}
OR username = #{username}

3、問題:但是因為數(shù)據(jù)量比較大,效率很低,請問有什么更合適的解決方案,提供思路即可,謝謝。

回答
編輯回答
巫婆

1、兩個字段都有單獨的唯一索引用union all查詢判斷結果不會慢的
2、利用mysql唯一索引的沖突異常,應用捕獲異常也可以

2017年12月20日 23:02
編輯回答
帥到炸

其實沒必要count, limit 1就好,有則立即放回,沒有第一個條件再查下一個

2017年8月5日 19:36
編輯回答
獨白

前提:唯一索引
1、replace into 有,先刪除再插入;無,直接插入。會有id間隙
2、insert ignore into 有,id空出來;無,插入。會有id間隙。
3、insert into on duplicate key update 有,則更新;無,則插入。

第二種第三種都用過,喜歡第三種,希望你也喜歡!

2018年6月16日 12:34
編輯回答
瘋浪

可以使用數(shù)據(jù)庫索引;為你不能重復的字段加唯一索引限制,插入的時候

2017年6月14日 10:58
編輯回答
神經(jīng)質(zhì)

可以直接用mysql的 insert on duplicate key 來解決

https://dev.mysql.com/doc/ref...

你可以選擇當唯一索引重復時,忽略插入或者刪除

INSERT [IGNORE] INTO USER (phone, username,xxxxx ) values (#{phone},#{username}, xxxxx) 
[ ON DUPLICATE KEY UPDATE xxxxx = #{xxxxx}]
2018年4月27日 11:03
編輯回答
汐顏

我今天下午用mysql+navicat試了一下,100w條數(shù)據(jù),
總共6組結果
1、無索引,union,平均0.7s
2、無索引,or,平均0.4s
3、兩個唯一性索引,union,平均0.1s
4、兩個唯一性索引,or,平均0.08
5、一個聯(lián)合索引,union,平均0.4s
6、一個聯(lián)合索引,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';
2018年5月31日 02:10
編輯回答
風畔

數(shù)據(jù)量很大可以考慮分表。

優(yōu)化方案,可以考慮分兩次查詢,第一個不重復才去檢查另一個,同時給這兩個字段加索引。

2017年8月28日 15:30
編輯回答
小曖昧

考慮用exists來優(yōu)化一下 另外增加phone和username聯(lián)合索引

2018年2月4日 07:21