mysql数据转存到时序数据库_干货丨如何高速迁移MySQL数据到时序数据库DolphinDB...
DolphinDB提供了兩種導入MySQL數據的方法:ODBC插件和MySQL插件。我們推薦使用MySQL插件導入MySQL數據,因為它的速度比ODBC導入更快,導入6.5G數據,MySQL插件的速度是ODBC插件的4倍,并且使用MySQL插件無需任何配置,而ODBC插件需要配置數據源。
在使用MySQL插件之前,請先參考DolphinDB安裝使用指南安裝DolphinDB。
1.下載插件
2.加載插件
在GUI中,使用loadPlugin函數加載MySQL插件:
loadPlugin(server_dir+"/plugins/mysql/PluginMySQL.txt")
3.接口函數
DolphinDB的MySQL插件提供了以下接口函數:
connect
showTables
extractSchema
load
loadEx
我們可以通過以下兩種方式調用插件的接口函數:
(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 connect
語法
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的內存表中。
例子
把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
...
把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
加載時把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 database將是不二選擇。
文章來源: segmentfault.com,作者:DolphinDB,版權歸原作者所有,如需轉載,請聯系作者。
原文鏈接:segmentfault.com/a/1190000038793370
總結
以上是生活随笔為你收集整理的mysql数据转存到时序数据库_干货丨如何高速迁移MySQL数据到时序数据库DolphinDB...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 定期产品会不会亏?分三种情况介绍
- 下一篇: 信用卡额度不够刷?试试这三种提额方法