插入的問題
php操作大批量資料的時候,我想到的解決方案如下
方法一:foreach迴圈遍曆中構造sql語句然後插入資料庫
insert into xxx values (xxx,xxx,xxx)
方法二:foreach迴圈遍曆構造sql語句,最後一次性插入
insert into xxx(field1,field2,field3)values(xxx1,xxx2,xxx3),(xxx1,xxx2,xxx3)
以上只是插入,如果要在插入的時候先判斷插入的資料是否存在資料庫中,那每一次插入之前都要進行一次select的操作,這樣效率不高?如何最佳化蛤?
更新的問題
其實類似於上面的插入,update之前先select,如果存在就update,不存在就insert,這樣sql語句依然很多,如何最佳化呢?
回複內容:
插入的問題
php操作大批量資料的時候,我想到的解決方案如下
方法一:foreach迴圈遍曆中構造sql語句然後插入資料庫
insert into xxx values (xxx,xxx,xxx)
方法二:foreach迴圈遍曆構造sql語句,最後一次性插入
insert into xxx(field1,field2,field3)values(xxx1,xxx2,xxx3),(xxx1,xxx2,xxx3)
以上只是插入,如果要在插入的時候先判斷插入的資料是否存在資料庫中,那每一次插入之前都要進行一次select的操作,這樣效率不高?如何最佳化蛤?
更新的問題
其實類似於上面的插入,update之前先select,如果存在就update,不存在就insert,這樣sql語句依然很多,如何最佳化呢?
1- Mysql還有一種文法是 REPLACE INTO,存在就更新,否則插入
2- Mysql還有一種文法是 INSERT INTO ... ON DUPLICATE KEY UPDATE,存在唯一鍵鍵衝突就更新
3- 實際開發中大批量資料插入是很罕見的,至少1000條以下肯定不算大批量,所以如果你是想省事的話,通常你會驗證一時偷懶節約了4小時所引起的麻煩夠你折騰8小時這個預言。
通常大批量資料插入發生在資料從舊資料庫中匯入,但是這種匯入通常只有一次,所以怎麼認真對待都不為過,其它的比如從上傳的csv檔案中匯入資料需要看具體的商務邏輯,比較常見的是使用try/catch進行插入,失敗的資料顯示出來,讓使用者確認覆蓋,然後再update。
1)如果能保證insert肯定沒有資料重複,那肯定是insert更合適
2)索引~,恰當的索引真的對提升效能有很大協助
3)用mysql的批處理匯入,對效能提升有一定協助,但缺點是可能會丟資料。
4)把自動commit=true也就是事務關閉,每提交若干個(打比方1W條記錄)之後集中commit一次,速度能有很大提升,單機差不多好點的配置1W QPS也是很輕鬆的
5)從新設計mysql庫,讀寫分離,做叢集,上SSD...
REPLACE 存在則刪除插入 或者 DUPLICATE 存在則更新
可以用replace 就可以解決update和insert的煩惱
on duplicate key update 用這個,每不想重複的欄位建唯一索引,這樣就不用你查一下在選擇插入還是更新了。他可以做到當重複時會自動執行UPDATE後面的語句
不一定要用REPLACE和DUPLICATE吧,可以試試:
開啟事務,迴圈插入,如果插入失敗,則改為更新.
query('SET AUTOCOMMIT=0');$db->query('START TRANSACTION');//開始迴圈if(!$db->query('INSERT INTO posts(id, post_title, post_content) VALUES(1,"title_1","content_1")')) { $db->query('UPDATE posts SET post_title = "title_1", post_content = "content_1" WHERE id = 1');}//插入失敗,或者沒有AUTO_INCREMENT欄位,或者不是INSERT語句,insert_id為0.echo $db->insert_id;$db->query('COMMIT');$db->query('SET AUTOCOMMIT=1');