乾貨丨如何高速遷移MySQL數據到時序數據庫DolphinDB

DolphinDB提供了兩種導入MySQL數據的方法:ODBC插件和MySQL插件。咱們推薦使用MySQL插件導入MySQL數據,由於它的速度比ODBC導入更快,導入6.5G數據,MySQL插件的速度是ODBC插件的4倍,而且使用MySQL插件無需任何配置,而ODBC插件須要配置數據源。mysql

在使用MySQL插件以前,請先參考DolphinDB安裝使用指南安裝DolphinDB。git

1.下載插件

DolphinDB安裝目錄/server/plugins/mysql已經包含MySQL插件,用戶能夠直接使用該插件。若是用戶須要自行編譯,能夠參考https://github.com/dolphindb/DolphinDBPlugin/blob/master/mysql/README_CN.mdgithub

2.加載插件

在GUI中,使用loadPlugin函數加載MySQL插件:sql

loadPlugin(server_dir+"/plugins/mysql/PluginMySQL.txt")

3.接口函數

DolphinDB的MySQL插件提供瞭如下接口函數:數據庫

  • connect
  • showTables
  • extractSchema
  • load
  • loadEx

 

咱們能夠經過如下兩種方式調用插件的接口函數:api

(1)moduleName::apiFunction。例如,調用MySQL插件的connect方法。服務器

mysql::connect(host, port, user, password, db)

(2)use moduleName,而後直接調用接口函數。只要執行一次use語句後,後續調用接口函數都不須要從新執行use函數。所以,咱們通常推薦這種調用方法。分佈式

use mysql
connect(host, port, user, password, db)

 

3.1 connectide

語法函數

connect(host, port, user, password, db)

參數

host是MySQL服務器的主機名。

port是MySQL服務器的端口號,默認爲3306。

user是MySQL服務器中的用戶名。

password是與user對應的密碼。

db是MySQL中的數據庫名稱。

詳情

建立MySQL鏈接,返回MySQL的鏈接句柄。咱們建議MySQL用戶的Authentication Type爲mysql_native_password。

例子

鏈接本地MySQL服務器中的employees數據庫。

conn=connect("127.0.0.1",3306,"root","123456","employees")

 

3.2 showTables

語法

showTables(connection)

參數

connection是connect函數返回的鏈接句柄。

詳情

返回一個DolphinDB類型的數據表,包含MySQL數據庫中全部表的名稱。

例子

查看employees數據庫中的表。

showTables(conn);

Tables_in_employees
current_dept_emp
departments
dept_emp
dept_emp_latest_date
dept_manager
employees
salaries
test_datatypes
titles

 

3.2 extractSchema

語法

extractSchema(connection, tableName)

參數

connection是connect函數返回的鏈接句柄。

tableName是MySQL數據庫中的數據表名稱。

詳情

返回結果是DolphinDB類型的表。第一列是MySQL數據表中的字段名,第二列是數據導入到DolphinDB後的數據類型,第三列是MySQL中的數據類型。

例子

查看employees表中各列的數據類型。

extractSchema(conn,`employees);

name	        type	  MySQL describe type	
emp_no	        LONG	  int(11)	                
birth_date	DATE	  date	                
first_name	STRING	  varchar(14)	        
last_name	STRING	  varchar(16)	        
gender	        SYMBOL	  enum('M','F')	        
hire_date	DATE	  date

3.3 load

語法

load(connection, table|query, [schema], [startRow], [rowNum])

參數

connection是connect函數返回的鏈接句柄。

table是MySQL服務器中的表名。

query是MySQL中的查詢語句。

schema是DolphinDB類型的表,它包含兩列,第一列是字段名稱,第二列是數據類型。它是可選參數。用戶能夠經過指定該參數來修改數據加載到DolphinDB時的數據類型。

startRow是正整數,表示讀取數據的起始行數。它是可選參數,默認值爲0,表示從第一條記錄開始讀取數據。

rowNum是正整數,表示讀取的記錄行數。它是可選參數,若是沒有指定,表示讀取全部的數據。若是第二個參數爲query,那麼startRow和rowNum參數無效。

詳情

把MySQL數據加載到DolphinDB的內存表中。

例子

  1. 把employees表中的全部數據加載到DolphinDB的內存表中。
t=load(conn,"employees");

emp_no	birth_date	first_name	last_name	gender	hire_date
10,001	1953.09.02	Georgi	        Facello	        M	1986.06.26
10,002	1964.06.02	Bezalel	        Simmel	        F	1985.11.21
10,003	1959.12.03	Parto	        Bamford	        M	1986.08.28
10,004	1954.05.01	Chirstian	Koblick	        M	1986.12.01
10,005	1955.01.21	Kyoichi	        Maliniak	M	1989.09.12
10,006	1953.04.20	Anneke	        Preusig	        F	1989.06.02
10,007	1957.05.23	Tzvetan	        Zielinski	F	1989.02.10
10,008	1958.02.19	Saniya	        Kalloufi	M	1994.09.15
10,009	1952.04.19	Sumant	        Peac	        F	1985.02.18
10,010	1963.06.01	Duangkaew	Piveteau	F	1989.08.24
...

2. 把employees表中的前10行數據加載到DolphinDB的內存表中。

t=load(conn,"select * from employees limit 10");

emp_no	birth_date	first_name	last_name	gender	hire_date
10,001	1953.09.02	Georgi	        Facello	        M	1986.06.26
10,002	1964.06.02	Bezalel	        Simmel	        F	1985.11.21
10,003	1959.12.03	Parto	        Bamford	        M	1986.08.28
10,004	1954.05.01	Chirstian	Koblick	        M	1986.12.01
10,005	1955.01.21	Kyoichi	        Maliniak	M	1989.09.12
10,006	1953.04.20	Anneke	        Preusig	        F	1989.06.02
10,007	1957.05.23	Tzvetan	        Zielinski	F	1989.02.10
10,008	1958.02.19	Saniya	        Kalloufi	M	1994.09.15
10,009	1952.04.19	Sumant	        Peac	        F	1985.02.18
10,010	1963.06.01	Duangkaew	Piveteau	F	1989.08.24

3. 加載時把last_name的數據類型修改成SYMBOL。

schema=select name,type from extractSchema(conn,`employees)
update schema set type="SYMBOL" where name="last_name"
t=load(conn,"employees",schema)
//查看錶t的結構
schema(t);

chunkPath->
partitionColumnIndex->-1
colDefs->
name       typeString typeInt
---------- ---------- -------
emp_no     LONG       5      
birth_date DATE       6      
first_name STRING     18     
last_name  SYMBOL     18
gender     SYMBOL     17     
hire_date  DATE       6

3.4 loadEx

語法

loadEx(connection, dbHandle, tableName, partitionColumns, table|query, [schema], [startRow], [rowNum])

參數

connection是connect函數返回的鏈接句柄。

dbHandle是DolphinDB的數據庫句柄,一般是database函數返回的對象。

tableName是DolphinDB數據庫中的表名。

partitionColumns是字符串標量或向量,表示分區列。

table是字符串,表示MySQL服務器中表的名稱。

query是MySQL中的查詢語句。

schema是DolphinDB類型的表,它包含兩列,第一列是字段名稱,第二列是數據類型。它是可選參數。用戶能夠經過指定該參數來修改數據加載到DolphinDB時的數據類型。

startRow是正整數,表示讀取數據的起始行數。它是可選參數,默認值爲0,表示從第一條記錄開始讀取數據。

rowNum是正整數,表示讀取的記錄行數。它是可選參數,若是沒有指定,表示讀取全部的數據。若是第二個參數爲query,那麼startRow和rowNum參數無效。

詳情

把MySQL中的數據加載到DolphinDB的分區表中。loadEx不支持把數據加載到DolphinDB的順序分區表中。

例子

把employees表加載到DolphinDB的磁盤VALUE分區表中。

db=database("H:/DolphinDB/Data/mysql",VALUE,`F`M)
pt=loadEx(conn,db,"pt","gender","employees")
select count(*) from loadTable(db,"pt");

count
300,024

若是須要把數據加載到內存分區表,只須要把database的路徑改成空字符串;若是須要把數據加載到分佈式表,只須要把database路徑修改成以「dfs://」開頭的路徑,好比「dfs://mysql」。分佈式表須要在集羣中才能使用。集羣部署請參考單服務器集羣部署多服務器集羣部署

4. 數據類型轉換

使用MySQL插件把數據導入到DolphinDB時,會作相應的類型轉換。具體轉換規則以下表所示:

說明:

(1)DolphinDB中的整型(SHORT, INT, LONG)都是有符號的,爲了防止溢出,MySQL中的無符號類型在DolphinDB中都會被轉換爲高一階的有符號類型。例如,無符號的tinyint轉換爲short,無符號的smallint轉換爲short等。目前,MySQL插件不支持64位無符號類型轉換。

(2)在DolphinDB中,整型的最小值表示NULL:CHAR類型的-128,SHORT類型的-32,768,INT類型的-2,147,483,648,LONG類型的-9,223,372,036,854,775,808都表示NULL。

(3)對於MySQL中的bigint unsigned類型,默認會轉換成DolphinDB的LONG類型。若是出現溢出的狀況,須要用戶使用schema參數,指定類型爲DOUBLE或FLOAT。

(4)MySQL中的char和varchar類型,若是長度小於等於10,會被轉換成DolphinDB的SYMBOL類型,若是長度大於10,會被轉換成DolphinDB的STRING類型。SYMBOL類型在DolphinDB內部存儲爲整數,所以數據排序和比較的效率會更高,同時也能夠節省存儲空間。可是將字符串映射到整數須要時間,映射表也會佔用內存。用戶能夠根據下面的規則來決定某列是否採用SYMBOL類型:若是該字段的值會大量重複出現,使用SYMBOL類型。如金融數據中的股票代碼、交易所、合約代碼等,物聯網數據中的設備編號等都是使用SYMBOL類型的典型場景。

5. 性能測試

咱們在普通PC上(16G內存,4核8線程,使用SSD)進行了性能測試。使用的數據集爲美國股票市場1990年到2016年的每日報價數據,數據量爲6.5G,包含22個字段,50,591,907行記錄,在MySQL數據庫中磁盤佔用爲7.2G。使用loadEx函數把數據從MySQL導入到DolphinDB的分區數據庫耗時僅160.5秒,讀取速度達到了41.4M/s,在 DolphinDB database 中磁盤佔用爲1.3G。在一樣的PC上,因爲使用ODBC一次性導入數據會形成MySQL內存不足,所以每次導入100萬條數據,總耗時660秒。將一樣的數據導入clickhouse耗時171.9秒,讀取速度爲37.8M/s。DolphinDB在時間序列數據的處理和分區管理上比clickhouse更加方便。

若是既要保證性能,同時友好支持時序數據的各類處理和分佈式數據庫,那麼DolphinDB將是不二選擇。

相關文章
相關標籤/搜索