mysql - php大批量插入及更新的問題

來源:互聯網
上載者:User

插入的問題

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');
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.