因兄弟項目中mysql有點扛不住了,要做sql優化,但是業務有點小複雜,優化起來有點麻煩(sql嵌套有點多),便想着用Mpp資料庫Greenplum測試下,看性能和複雜度怎麼樣,趟趟水。
1. 場景描述
2.解決方案
初步的想法是:因為mysql和postgresql(Greenplum建立在postgresql之上,i'm 軟體老王)都是使用的标準sql,直接把mysql的建表語句在Greenplum建一邊,把資料導入過來測試一下就行了,應該半天内就能搞定。
2.1 Greenplum建表
将mysql的表結構通過navicat for mysql導出(navivat中隻導出表結構,如下圖),但是發現導出的結構在
Greenplum中執行不了,mysql中的ddl語句:
`CONFIG_ID` varchar(36) COLLATE utf8_unicode_ci NOT NULL COMMENT '軟體老王'
解決辦法
(1)網上找了mysql轉postgresql的java代碼,寫的不是太全面,改了幾次還是有點問題,放棄。
(2)問了下dba,用的Navicat Premium 12 可以轉,網址:https://www.navicat.com.cn/
Navicat Premium可以同時操作多個資料庫,包括:mysql和greenplum(postgresql),以前使用navicat for mysql隻能操作mysql資料庫,navicat for postgresql隻能操作postgresql。
2.2 導出資料結構
使用Navicat Premium,如下圖:
左邊選擇mysql,右邊選擇greenplum,同時去掉選項中的建立記錄,就能在Greenplum中建立表了。(先建立所有表,資料量太大,我們隻導幾張表的資料進行測試)
2.3 導入資料。
2.3.1 初步想法
初步想法是通過Navicat 直接導入,使用上面的Navicat Premium12就能直接從mysql導入Greenplum資料,但是導入了幾張小表後,碰到的一張30多萬的表,導了20多分鐘還不到40%,看了下greenplum的master節點cpu有點高,後面還有好幾張百萬級的資料,這樣的效率要導到猴年馬月了。
2.3.2 外部表方式
(1)首先需要在master節點啟動外部表程式fdisk,建立個目錄,存放從mysql中導出的檔案,我導出的是csv格式。
[gpadmin@軟體老王 ~]$ mkdir script
[gpadmin@軟體老王 ~]$ nohup gpfdist -d /home/gpadmin/script/ -p 8081 -l /home/gpadmin/script/ruanjianlaowang.log &
(2)建立外部表
------------------------
CREATE EXTERNAL TABLE "public"."t_laowang_ex" (
"laowang_type" numeric(3),
"laowang_id" varchar(36)
)
location ('gpfdist://10.192.0.168:8081/laowang.csv') format 'csv' (DELIMITER ',') encoding 'utf8';
說明:
(a)可以直接将原表的ddl語句拿出來,名稱增加個_ex(建立外部表的時候,發現not null用不了要替換成空)
(b)其中ip位址是greenplum的master位址,laowang是csv檔案名稱,csv檔案是通過navicat右鍵導出的,i‘m 軟體老王。
gpfdist://10.192.0.168:8081/laowang.csv
(3)資料裝載到greenplum表中
insert into t_laowang select * from t_laowang_ex;
i'm 軟體老王
這樣就完成了資料從mysql遷移到了greenplum中,具體測試結果對比就不在這裡多說了。
2.4 總體結論
方案執行比想象的複雜,一是兩個資料庫建表sql不一樣,後通過最新的Navicat Premium 12 解決;二是直接通過navicat導入,在效率上有問題,走不通,通過外部表的方式解決,外部表方式2-3秒就能導入完成;三是,建立外部表的時候,跟原表稍微有點差異,也的注意下。
I’m 「軟體老王」,如果覺得還可以的話,關注下呗,後續更新秒知!歡迎讨論區、同名公衆号留言交流!
更多資訊請關注公衆号:「軟體老王」,關注不迷路,IT技術與相關幹貨分享,回複關鍵字擷取對應幹貨,本文版權歸作者軟體老王所有,轉載需注明作者、超連結,否則保留追究法律責任的權利。