mysql - PHP 批量插入的時候 判斷數(shù)據(jù)表里面是否重復(fù)怎么優(yōu)化
問題描述
場景:從第三方接口獲取到數(shù)據(jù) 比如 獲取到了 500 條,然后批量插入到表,但是要保證唯一。代碼如果是這樣的(name 字段有索引的情況下怎么才能最大化的優(yōu)化),這樣的結(jié)果是有500次的I/O 這個邏輯怎么優(yōu)化最佳呢;這里還有個場景如果當(dāng)這 500條插入成功后馬上進(jìn)行二次查詢第三方接口然后再批量插入,主要是考慮到第二種情況:
$datas = [];$Apps = new Apps();foreach ($lists as $k=>$v){ $name = $v[’name’]; $res = $Apps->where([’name’ => $name])->field(’name’)->find(); //如果沒有記錄 if (empty($res)){$datas[] = [’name’ => $name]; }}if (empty($datas)){ //批量插入 $Apps->saveAll($datas);}
問題解答
回答1:保證唯一放在數(shù)據(jù)庫那邊處理,設(shè)置個unique就好了吧。這個不需要PHP來處理。
回答2:設(shè)置聯(lián)合主鍵
回答3:不能重復(fù)的字段加唯一索引吧
回答4:首先對該字段加唯一索引,然后SQL改成這樣,?INSERT INTO xx (yy)VALUES(?) ON DUPLICATE KEY UPDATE yy=?但唯一鍵出現(xiàn)重復(fù)時更新字段,也可以忽略重復(fù),對重復(fù)的行不做修改INSERT IGNORE INTO
相關(guān)文章:
1. JavaScript將.apply()與'new'運算符配合使用這可能嗎?2. angular.js - webpack build后的angularjs路由跳轉(zhuǎn)問題3. java - web項目中,用戶登陸信息存儲在session中好 還是cookie中好,取決于什么?4. java - Activity中的成員變量被賦值之后,Activity被回收的時候內(nèi)存才會被釋放嗎5. 請求一個數(shù)據(jù)返回內(nèi)容為空或者錯誤如何再次請求幾次6. 數(shù)組按鍵值封裝!7. 老師,flex-shrink: 1; 按視頻操作,不會自動縮放8. 為什么bindClass訪問不了的?9. Discuz! Q 有人用過嗎?10. php由5.3升級到5.6后,登錄網(wǎng)站,返回的是php代碼,不是登錄界面,各位大神有知道的嗎?
