簡單介紹mysql中資料庫覆蓋匯入的幾種方式
導讀 | 這篇文章主要介紹了mysql中資料庫覆蓋匯入的幾種方式總結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教 |
眾所周知,資料庫中INSERT INTO語法是append方式的插入,而最近在處理一些客戶資料匯入場景時,經常遇到需要覆蓋式匯入的情況
常見的覆蓋式匯入主要有下面兩種:
1、部分覆蓋:新老資料根據關鍵列值匹配,能匹配上則使用新資料覆蓋,匹配不上則直接插入。
2、完全覆蓋:直接刪除所有老資料,插入新資料。
本文主要介紹如何在資料庫中完成覆蓋式資料匯入的方法。
某業務每天給業務表中匯入大資料進行分析,業務表中某列存在主鍵,當插入資料和已有資料存在主鍵衝突時,希望能夠對該行資料使用新資料覆蓋或者說更新,而當新老資料userid不衝突的情況下,直接將新資料插入到資料庫中。以將表src中的資料覆蓋式匯入業務表des中為例:
方案一:使用DELETE+INSERT組合實現(UPDATE也可以,請讀者思考)
--開啟事務 START TRANSACTION; --去除主鍵衝突資料 DELETE FROM des USING src WHERE EXISTS (SELECT 1 FROM des WHERE des.userid = src.userid); --匯入新資料 INSERT INTO des SELECT * FROM src WHERE NOT EXISTS (SELECT 1 FROM des WHERE des.userid = src.userid); --事務提交 COMMIT;
方案優點:使用最常見的使用DELETE和INSERT即可實現。
方案缺點:1、分了DELETE和INSERT兩個步驟,易用性欠缺;2、藉助子查詢識重,DELETE/INSERT效能受查詢效能制約。
方案二:使用MERGE INTO功能實現
MERGE INTO des USING src ON (des.userid = src.userid) WHEN MATCHED THEN UPDATE SET des.b = src.b WHEN NOT MATCHED THEN INSERT VALUES (src.userid,src.b);
方案優點:MERGE INTO單SQL搞定,使用便捷,內部去重效率高。
方案缺點:需要資料庫產品支援MERGE INTO功能,當前Oracle、GaussDB(DWS)等資料庫已支援此功能,mysql的insert into on duplicate key也類似此功能。
某業務每天給業務表中匯入一定時間區間的資料進行分析,分析只需要匯入時間區間的去除,不需要以往歷史資料,這種情況就需要使用到覆蓋式匯入。
方案一:使用TRUNCATE+INSERT組合實現
--開啟事務 START TRANSACTION; --清除業務表資料 TRUNCATE des; --插入1月份資料 INSERT INTO des SELECT * FROM src WHERE time > '2020-01-01 00:00:00' AND time < '2020-02-01 00:00:00'; --提交事務 COMMIT;
方案優點:簡單暴力,先清理在插入直接實現類似覆蓋寫功能。
方案缺點:TRUNCATE清理業務表des資料時對錶加8級鎖直到事務結束,在因資料量巨大而INSERT時間很長的情況下,des表在很長時間內是不可訪問的狀態,業務表des相關的業務處於中斷狀態。
方案二:使用建立臨時表過渡的方式實現
--開啟事務 START TRANSACTION; --建立臨時表 CREATE TABLE temp(LIKE desc INCLUDING ALL); --資料先匯入到臨時表中 INSERT INTO temp SELECT * FROM src WHERE TIME > '2020-01-01 00:00:00' AND TIME < '2020-02-01 00:00:00'; --匯入完成後刪除業務表des DROP TABLE des; --修改臨時表名temp->des ALTER TABLE temp RENAME TO des; --提交事務 COMMIT;
方案優點:相比方案一,在INSERT期間,業務表des可以繼續被訪問(老資料),即事務提交前分析業務可繼續訪問老資料,事務提交後分析業務可以訪問新匯入的資料。
方案缺點:1、組合步驟較多,不易用;2、DROP TABLE操作會刪除表的依賴物件,例如檢視等,後面依賴物件的還原可能會比較複雜。
方案三:使用INSERT OVERWRITE功能
INSERT OVERWRITE INTO des SELECT * FROM src WHERE time > '2020-01-01 00:00:00' AND time < '2020-02-01 00:00:00';
方案優點:單條SQL搞定,執行便捷,能夠支援一鍵式切換業務查詢的新老資料,業務不中斷。
方案缺點:需要產品支援INSERT OVERWRITE功能,當前impala、GaussDB(DWS)等資料庫均已支援此功能。
隨著大資料的場景越來越多,資料匯入的場景也越來越豐富,除了本文介紹的覆蓋式資料匯入,還有其他諸如忽略衝突的INSERT IGNORE匯入等等其他的匯入方式,這些匯入場景可以以使用基礎的INSERT、UPDATE、DELETE、TRUNCATE來組合實現,但是也同樣會對高階的一鍵SQL功能有直接訴求,後面有機會再敘述。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2886820/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 教你兩種資料庫覆蓋式資料匯入方法資料庫
- MYSQL資料匯出備份、匯入的幾種方式MySql
- 簡單介紹redis加鎖常用幾種方式Redis
- 簡單介紹MySQL索引失效的幾種情況MySql索引
- jinq 入門介紹-java中編寫資料庫查詢的簡單自然的方式Java資料庫
- oracle資料庫透過sqlplus連線的幾種方式介紹Oracle資料庫SQL
- 簡單介紹MySQL開啟事務的兩種方式MySql
- MySql資料庫備份的幾種方式MySql資料庫
- mysql 匯入匯出資料庫以及函式、儲存過程的介紹MySql資料庫函式儲存過程
- MySQL 資料庫定時備份的幾種方式MySql資料庫
- MySQL資料備份多種引數介紹及簡單示例MySql
- JavaScript中的幾種資料結構簡介JavaScript資料結構
- 117 遠端連線mysql資料庫的幾種方式MySql資料庫
- 對GaussDB資料庫和資料管理的簡單介紹資料庫
- 資料庫 MySQL 資料匯入匯出資料庫MySql
- 分散式鎖簡單入門以及三種實現方式介紹分散式
- MySQL資料庫鎖介紹MySql資料庫
- rest_framework django 簡單使用(資料庫建立資料, 覆蓋資料, 其他的大同小異)RESTFrameworkDjango資料庫
- Mysql 資料庫匯入與匯出MySql資料庫
- 資料庫介紹--認識簡單的SQL語句資料庫SQL
- [轉]Oracle資料庫ASH和AWR的簡單介紹Oracle資料庫
- 資料庫SQL調優的幾種方式資料庫SQL
- 簡單介紹python連線telnet和ssh的兩種方式Python
- 簡單介紹apache虛擬主機配置的三種方式Apache
- HSQL 資料庫介紹(1)--簡介SQL資料庫
- 達夢資料庫執行緒簡單介紹資料庫執行緒
- MySQL資料庫索引簡介MySql資料庫索引
- mysql資料庫應付大流量網站的的3種架構擴充套件方式介紹MySql資料庫網站架構套件
- Nginx中常見的幾種負載均衡方式介紹!Linux入門必看Nginx負載Linux
- MySQL 寫入壓測幾種方式MySql
- Python操作MySQL資料庫的5種方式PythonMySql資料庫
- mysql的 information_schema 資料庫介紹MySqlORM資料庫
- 簡單介紹資料庫技術發展階段!資料庫
- 國產資料庫:達夢資料庫的幾個版本介紹資料庫
- MySQL檢視版本號的五種方式介紹MySql
- 資料庫訪問幾種方式對比資料庫
- Excel資料快速匯入mysql的幾個辦法ExcelMySql
- Untiy 中的幾個資料夾的介紹