有這樣的一類需求,快速複製一張表,而這張表的資料量又非常的大。比方說本來是分割槽表,要把它重新變成非分割槽表,怎麼能夠快速的完成這樣的操作呢?我下面給出2種大致的方法:
第一,就是利用ctas方式來建立一張新錶,當然要想加快速度,在資料庫不是force logging的前提下,可以使用nologging方式來建立表
sql> create table auction_auctions_bak
2 tablespace tbs_taobao
3 nologging
4 as
5 select * from auction_auctions;
table created.
sql> select count(*) from auction_auctions;
count(*)
----------
4179779
sql> select count(*) from auction_auctions_bak;
count(*)
----------
4179779
在建立完成表以後,要注意將表的屬性重新變成logging:
sql> select logging from tabs where table_name='auction_auctions_bak';
log---
nosql> alter table auction_auctions_bak logging;
table altered.
最後將表名更改過來,建立一下新的索引,然後就可以了。
sql> drop table auction_auctions;
table dropped.
sql> rename auction_auctions_bak to auction_auctions;
table renamed.
第二,在原理上,它其實和第一種方式差不多,就是阻止資料庫記錄日誌來加快速度,大概過程如下:
1、exp出原表(建議compress=n)
2、drop 原表
3、以nologging的方式,新建與原表同名的空表
4、imp原表至空表中,注意要把ignore設定為y
5、更改新錶的屬性為logging
我這次分別都對兩種方式做了測試,結果第二種方式遠遠快於第一種方式,大概是其10倍的速度。注意以上兩種方式都是在資料庫沒有force logging的前提下完成的。如果資料庫被force logging了,那麼怎樣才能加快複製速度,這個大家可以說說。
mysq優化之(快速複製一張大資料的表)
一千萬條資料只花了兩分多鐘,這裡忘記截圖了 關閉了自動提交 關閉了唯一性檢查 load比傳統的insert效率高很多 蠕蟲複製500萬條資料只要1分多鐘的優化方式 innodb儲存引擎 關閉自動提交 set autocommit 0 關閉唯一性檢查 set unique checks 0 導完資料記...
同步一張大表技術實現方案
目錄 1 背景 2 技術方案 3 技術方案修正 3.2 改寫分頁sql 4 參考資料 表中有乙個主鍵字段,主鍵id是有時間特性,按照時間公升序增長的,可以認為id是雪花演算法生成的id,目前表中有1億條資料,我們需要把這1億條資料同步到es中。我們將全表資料看成是乙個大的資料集,從邏輯上進行分頁,每...
如何快速查詢一張大表的前面資料
公司生產上面有一張表,裡面資料有 3486764條,每次想去查詢最新的幾條資料時總是很慢,以下為使用的語句 select from txn fin txn log t order by t.id desc 因為有order by語句會很慢,查詢出來將近1分鐘才能出來,有時候更長 經過腦海裡想了之後,...