成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們一起聊聊 DuckDB 是什么及適用場(chǎng)景

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
官方文檔就是一個(gè)寶庫(kù),有著非常豐富的說(shuō)明及示例,網(wǎng)址為:https://duckdb.org/docs/index。要想深入理解及掌握 DuckDB,需要多讀讀官方文檔。

DuckDB 是一款集輕量級(jí)、高性能于一體的嵌入式分析型數(shù)據(jù)庫(kù),以其卓越的數(shù)據(jù)查詢(xún)和分析能力在數(shù)據(jù)庫(kù)領(lǐng)域嶄露頭角。這款基于C++ 編寫(xiě)的數(shù)據(jù)庫(kù),以其先進(jìn)的設(shè)計(jì)理念和高效的存儲(chǔ)引擎,為大規(guī)模數(shù)據(jù)處理提供了強(qiáng)有力的支持。

DuckDB 采用了獨(dú)特的列式存儲(chǔ)方式,相較于傳統(tǒng)的行式存儲(chǔ),這種存儲(chǔ)方式能更加高效地讀取和分析數(shù)據(jù)。通過(guò)將相同列的數(shù)據(jù)集中存儲(chǔ)在連續(xù)的物理位置,列式存儲(chǔ)顯著提升了數(shù)據(jù)的訪(fǎng)問(wèn)速度。此外,DuckDB 還利用壓縮算法進(jìn)一步減少了存儲(chǔ)空間需求,降低了 I/O 開(kāi)銷(xiāo),讓數(shù)據(jù)處理變得更加輕松高效。

在查詢(xún)優(yōu)化和執(zhí)行方面,DuckDB 同樣表現(xiàn)出色。它支持標(biāo)準(zhǔn)的 SQL 查詢(xún)語(yǔ)言,允許用戶(hù)通過(guò)簡(jiǎn)潔明了的 SQL 語(yǔ)句實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)查詢(xún)和分析任務(wù)。其優(yōu)化的執(zhí)行引擎充分利用內(nèi)存優(yōu)勢(shì),提供高并發(fā)和低延遲的查詢(xún)體驗(yàn)。同時(shí),DuckDB 還內(nèi)置了多種查詢(xún)優(yōu)化技術(shù),通過(guò)智能地選擇查詢(xún)路徑和減少數(shù)據(jù)掃描量,進(jìn)一步提高查詢(xún)效率。

作為一款嵌入式數(shù)據(jù)庫(kù),DuckDB 還具備良好的集成性。它提供了豐富的 API 接口,使開(kāi)發(fā)者能夠輕松地將 DuckDB 嵌入到各種應(yīng)用程序中,實(shí)現(xiàn)無(wú)縫的數(shù)據(jù)管理和查詢(xún)功能。這種高度的靈活性使得 DuckDB 成為各類(lèi)應(yīng)用系統(tǒng)中的理想選擇。

DuckDB 的適用場(chǎng)景

1.實(shí)時(shí)分析

在追求速度和響應(yīng)能力的實(shí)時(shí)分析領(lǐng)域,DuckDB 以其高性能和低延遲的特性成為不可或缺的工具。無(wú)論是監(jiān)控系統(tǒng)、實(shí)時(shí)報(bào)表還是預(yù)警系統(tǒng),DuckDB 都能快速響應(yīng)大量的數(shù)據(jù)查詢(xún)請(qǐng)求,提供準(zhǔn)確而及時(shí)的分析結(jié)果。這使得企業(yè)能夠?qū)崟r(shí)掌握業(yè)務(wù)動(dòng)態(tài),做出快速而明智的決策。

此外,DuckDB 的內(nèi)存優(yōu)化特性進(jìn)一步提升了實(shí)時(shí)分析的效率。通過(guò)將盡可能多的數(shù)據(jù)加載到內(nèi)存中,DuckDB 能夠顯著減少磁盤(pán) I/O 操作,從而加快查詢(xún)速度。這種優(yōu)勢(shì)在處理大規(guī)模數(shù)據(jù)集時(shí)尤為明顯,讓實(shí)時(shí)分析變得更加輕松高效。

2.數(shù)據(jù)倉(cāng)庫(kù)

DuckDB 同樣適用于構(gòu)建和管理數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)。作為輕量級(jí)的數(shù)據(jù)倉(cāng)庫(kù)解決方案,它能夠輕松應(yīng)對(duì)數(shù)據(jù)整合、清洗和轉(zhuǎn)換等復(fù)雜任務(wù)。通過(guò) ETL 過(guò)程,DuckDB 能夠?qū)?lái)自不同數(shù)據(jù)源的數(shù)據(jù)整合到一起,形成統(tǒng)一的數(shù)據(jù)視圖。然后,用戶(hù)可以利用其強(qiáng)大的查詢(xún)和分析能力,深入挖掘數(shù)據(jù)的價(jià)值,發(fā)現(xiàn)潛在的商業(yè)機(jī)會(huì)。

相較于傳統(tǒng)的大型關(guān)系型數(shù)據(jù)庫(kù),DuckDB 在數(shù)據(jù)倉(cāng)庫(kù)場(chǎng)景中具有更低的部署和維護(hù)成本。其輕量級(jí)特性使得數(shù)據(jù)倉(cāng)庫(kù)的構(gòu)建和管理變得更加簡(jiǎn)單高效,無(wú)需投入大量的人力和物力資源。同時(shí),DuckDB 的高性能和可擴(kuò)展性也能夠滿(mǎn)足大型數(shù)據(jù)倉(cāng)庫(kù)的需求,確保數(shù)據(jù)的快速處理和查詢(xún)。

3.嵌入式應(yīng)用

DuckDB 的嵌入式特性使其成為嵌入式應(yīng)用的理想選擇。無(wú)論是物聯(lián)網(wǎng)設(shè)備還是移動(dòng)應(yīng)用程序,都可以通過(guò)集成 DuckDB 實(shí)現(xiàn)本地?cái)?shù)據(jù)分析能力。這意味著設(shè)備或應(yīng)用程序可以直接在本地處理和分析數(shù)據(jù),無(wú)需依賴(lài)遠(yuǎn)程服務(wù)器或云端資源。

在物聯(lián)網(wǎng)設(shè)備中,DuckDB 可以幫助實(shí)現(xiàn)實(shí)時(shí)的數(shù)據(jù)采集和分析,提升設(shè)備的智能化水平。在移動(dòng)應(yīng)用程序中,它可以用于存儲(chǔ)和分析用戶(hù)數(shù)據(jù),提供個(gè)性化的服務(wù)和推薦,提升用戶(hù)體驗(yàn)。

4.大數(shù)據(jù)預(yù)處理

大數(shù)據(jù)預(yù)處理是數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)流程中不可或缺的一環(huán)。在這一環(huán)節(jié)中,DuckDB 同樣可以發(fā)揮重要作用。它能夠高效地對(duì)數(shù)據(jù)進(jìn)行清洗、轉(zhuǎn)換和聚合等操作,為后續(xù)的機(jī)器學(xué)習(xí)或數(shù)據(jù)挖掘任務(wù)提供高質(zhì)量的輸入數(shù)據(jù)。

DuckDB 支持各種復(fù)雜的 SQL 查詢(xún)和聚合操作,使得預(yù)處理工作變得更加簡(jiǎn)單高效。用戶(hù)可以通過(guò)編寫(xiě)SQL語(yǔ)句來(lái)定義數(shù)據(jù)轉(zhuǎn)換規(guī)則和處理邏輯,然后讓 DuckDB 自動(dòng)完成這些任務(wù)。這大大減輕了數(shù)據(jù)科學(xué)家的工作負(fù)擔(dān),讓他們能夠更專(zhuān)注于數(shù)據(jù)分析和模型構(gòu)建等核心任務(wù)。

接下來(lái)我們就理論聯(lián)系實(shí)際地使用一下 DuckDB,看看它有什么驚艷的地方。

安裝及簡(jiǎn)單使用

# MacOS 安裝
$ brew install duckdb


# Python 安裝
pip install duckdb


# NodeJS 安裝
npm install duckdb


# 或者從源碼安裝,愿意折騰的同學(xué)可以自行去安裝

安裝完成后,怎么使用呢?可以打開(kāi)命令行直接輸入 "duckdb" 即可進(jìn)入其命令行界面:

(venv311) ?  mypostgres git:(dev) duckdb
v1.0.0 1f98600c2c
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.


-- 查看版本號(hào)
D SELECT version();
┌───────────┐
│ version() │
│  varchar  │
├───────────┤
│ v1.0.0    │
└───────────┘


-- 下面的是官方的 Live Demo 中的一個(gè)示例,從 S3 存儲(chǔ)上面下載了一個(gè)數(shù)據(jù)文件,并導(dǎo)入到 DuckDB 中
D INSTALL httpfs;
100% ▕████████████████████████████████████████████████████████████▏ 
D CREATE TABLE train_services AS FROM 's3://duckdb-blobs/train_services.parquet';
100% ▕████████████████████████████████████████████████████████████▏ 
D show tables;
┌────────────────┐
│      name      │
│    varchar     │
├────────────────┤
│ train_services │
└────────────────┘
-- 或者執(zhí)行 .tables 也可以查看有哪些表
D .tables
train_services

如何查看表結(jié)構(gòu)呢?

D DESCRIBE train_services;
+----------------+-------------+------+-----+---------+-------+
|  column_name   | column_type | null | key | default | extra |
+----------------+-------------+------+-----+---------+-------+
| service_id     | BIGINT      | YES  |     |         |       |
| date           | DATE        | YES  |     |         |       |
| type           | VARCHAR     | YES  |     |         |       |
| train_number   | BIGINT      | YES  |     |         |       |
| station_code   | VARCHAR     | YES  |     |         |       |
| station_name   | VARCHAR     | YES  |     |         |       |
| departure_time | TIMESTAMP   | YES  |     |         |       |
| arrival_time   | TIMESTAMP   | YES  |     |         |       |
+----------------+-------------+------+-----+---------+-------+
changes: 380959   total_changes: 380959

查詢(xún) train_services 表的前 10 條數(shù)據(jù):

D SELECT * from train_services LIMIT 10;
┌────────────┬────────────┬───────────┬──────────────┬──────────────┬──────────────────────┬─────────────────────┬─────────────────────┐
│ service_id │    date    │   type    │ train_number │ station_code │     station_name     │   departure_time    │    arrival_time     │
│   int64    │    date    │  varchar  │    int64     │   varchar    │       varchar        │      timestamp      │      timestamp      │
├────────────┼────────────┼───────────┼──────────────┼──────────────┼──────────────────────┼─────────────────────┼─────────────────────┤
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ RTD          │ Rotterdam Centraal   │ 2023-05-15 00:00:00 │                     │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ DT           │ Delft                │ 2023-05-15 00:13:00 │ 2023-05-15 00:13:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ GV           │ Den Haag HS          │ 2023-05-15 00:29:00 │ 2023-05-15 00:21:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ LEDN         │ Leiden Centraal      │ 2023-05-15 00:45:00 │ 2023-05-15 00:44:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ SHL          │ Schiphol Airport     │ 2023-05-15 01:03:00 │ 2023-05-15 01:01:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ ASD          │ Amsterdam Centraal   │ 2023-05-15 01:19:00 │ 2023-05-15 01:17:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ UT           │ Utrecht Centraal     │                     │ 2023-05-15 01:48:00 │
│   11196118 │ 2023-05-15 │ Nightjet  │          420 │ NURNB        │ Nürnberg Hbf         │ 2023-05-15 00:01:00 │                     │
│   11196118 │ 2023-05-15 │ Nightjet  │          420 │ FFS          │ Frankfurt (Main) Süd │ 2023-05-15 01:47:00 │ 2023-05-15 01:45:00 │
│   11196118 │ 2023-05-15 │ Nightjet  │          420 │ FFFM         │ Frankfurt (M) Hbf    │                     │                     │
├────────────┴────────────┴───────────┴──────────────┴──────────────┴──────────────────────┴─────────────────────┴─────────────────────┤
│ 10 rows                                                                                                                    8 columns │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

還可以設(shè)置輸出樣式,默認(rèn)是 duckbox 樣式:

D .help mode
.mode MODE ?TABLE?       Set output mode
   MODE is one of:
     ascii     Columns/rows delimited by 0x1F and 0x1E
     box       Tables using unicode box-drawing characters
     csv       Comma-separated values
     column    Output in columns.  (See .width)
     duckbox   Tables with extensive features
     html      HTML <table> code
     insert    SQL insert statements for TABLE
     json      Results in a JSON array
     jsonlines Results in a NDJSON
     latex     LaTeX tabular environment code
     line      One value per line
     list      Values delimited by "|"
     markdown  Markdown table format
     quote     Escape answers as for SQL
     table     ASCII-art table
     tabs      Tab-separated values
     tcl       TCL list elements
     trash     No output


D .mode table


D SELECT * from train_services LIMIT 10;
+------------+------------+-----------+--------------+--------------+----------------------+---------------------+---------------------+
| service_id |    date    |   type    | train_number | station_code |     station_name     |   departure_time    |    arrival_time     |
+------------+------------+-----------+--------------+--------------+----------------------+---------------------+---------------------+
| 11196117   | 2023-05-15 | Intercity | 1410         | RTD          | Rotterdam Centraal   | 2023-05-15 00:00:00 |                     |
| 11196117   | 2023-05-15 | Intercity | 1410         | DT           | Delft                | 2023-05-15 00:13:00 | 2023-05-15 00:13:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | GV           | Den Haag HS          | 2023-05-15 00:29:00 | 2023-05-15 00:21:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | LEDN         | Leiden Centraal      | 2023-05-15 00:45:00 | 2023-05-15 00:44:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | SHL          | Schiphol Airport     | 2023-05-15 01:03:00 | 2023-05-15 01:01:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | ASD          | Amsterdam Centraal   | 2023-05-15 01:19:00 | 2023-05-15 01:17:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | UT           | Utrecht Centraal     |                     | 2023-05-15 01:48:00 |
| 11196118   | 2023-05-15 | Nightjet  | 420          | NURNB        | Nürnberg Hbf         | 2023-05-15 00:01:00 |                     |
| 11196118   | 2023-05-15 | Nightjet  | 420          | FFS          | Frankfurt (Main) Süd | 2023-05-15 01:47:00 | 2023-05-15 01:45:00 |
| 11196118   | 2023-05-15 | Nightjet  | 420          | FFFM         | Frankfurt (M) Hbf    |                     |                     |
+------------+------------+-----------+--------------+--------------+----------------------+---------------------+---------------------+

還可以獲取命令的幫助,進(jìn)入 DuckDB 后,輸入 `.help` 即可查看幫助手信息:

D .help
.bail on|off             Stop after hitting an error.  Default OFF
.binary on|off           Turn binary output on or off.  Default OFF
.cd DIRECTORY            Change the working directory to DIRECTORY
.changes on|off          Show number of rows changed by SQL
.check GLOB              Fail if output since .testcase does not match
.columns                 Column-wise rendering of query results
.constant ?COLOR?        Sets the syntax highlighting color used for constant values
.constantcode ?CODE?     Sets the syntax highlighting terminal code used for constant values
......
.sha3sum ...             Compute a SHA3 hash of database content
.shell CMD ARGS...       Run CMD ARGS... in a system shell
.show                    Show the current values for various settings
.system CMD ARGS...      Run CMD ARGS... in a system shell
.tables ?TABLE?          List names of tables matching LIKE pattern TABLE
.testcase NAME           Begin redirecting output to 'testcase-out.txt'
.timer on|off            Turn SQL timer on or off
.width NUM1 NUM2 ...     Set minimum column widths for columnar output

導(dǎo)出CSV文件

可以輕松地把數(shù)據(jù)導(dǎo)出到 CSV 文件:

D COPY train_services TO 'output.csv' (HEADER, DELIMITER ',');


-- 查看文件前 10 行內(nèi)容
D .shell head /tmp/output.csv
service_id,date,type,train_number,station_code,station_name,departure_time,arrival_time
11196117,2023-05-15,Intercity,1410,RTD,Rotterdam Centraal,2023-05-15 00:00:00,
11196117,2023-05-15,Intercity,1410,DT,Delft,2023-05-15 00:13:00,2023-05-15 00:13:00
11196117,2023-05-15,Intercity,1410,GV,Den Haag HS,2023-05-15 00:29:00,2023-05-15 00:21:00
11196117,2023-05-15,Intercity,1410,LEDN,Leiden Centraal,2023-05-15 00:45:00,2023-05-15 00:44:00
11196117,2023-05-15,Intercity,1410,SHL,Schiphol Airport,2023-05-15 01:03:00,2023-05-15 01:01:00
11196117,2023-05-15,Intercity,1410,ASD,Amsterdam Centraal,2023-05-15 01:19:00,2023-05-15 01:17:00
11196117,2023-05-15,Intercity,1410,UT,Utrecht Centraal,,2023-05-15 01:48:00
11196118,2023-05-15,Nightjet,420,NURNB,Nürnberg Hbf,2023-05-15 00:01:00,
11196118,2023-05-15,Nightjet,420,FFS,Frankfurt (Main) Süd,2023-05-15 01:47:00,2023-05-15 01:45:00

查詢(xún)的數(shù)據(jù)也可以導(dǎo)出到 CSV 文件:

COPY (SELECT * FROM tbl) TO 'output.csv' (HEADER, DELIMITER ',');

導(dǎo)入CSV文件

導(dǎo)入 CSV 文件有多種方式:

-- 通過(guò) read_csv() 函數(shù)直接讀取 CSV 文件
D SELECT * FROM read_csv("/tmp/output.csv");
┌────────────┬────────────┬──────────────────────┬──────────────┬──────────────┬───────────────────────────┬─────────────────────┬─────────────────────┐
│ service_id │    date    │         type         │ train_number │ station_code │       station_name        │   departure_time    │    arrival_time     │
│   int64    │    date    │       varchar        │    int64     │   varchar    │          varchar          │      timestamp      │      timestamp      │
├────────────┼────────────┼──────────────────────┼──────────────┼──────────────┼───────────────────────────┼─────────────────────┼─────────────────────┤
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ RTD          │ Rotterdam Centraal        │ 2023-05-15 00:00:00 │                     │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ DT           │ Delft                     │ 2023-05-15 00:13:00 │ 2023-05-15 00:13:00 │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ GV           │ Den Haag HS               │ 2023-05-15 00:29:00 │ 2023-05-15 00:21:00 │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ LEDN         │ Leiden Centraal           │ 2023-05-15 00:45:00 │ 2023-05-15 00:44:00 │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ SHL          │ Schiphol Airport          │ 2023-05-15 01:03:00 │ 2023-05-15 01:01:00 │
......
......
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ RHEINE       │ Rheine                    │ 2023-05-21 11:03:00 │                     │
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ BH           │ Bad Bentheim              │ 2023-05-21 11:16:00 │ 2023-05-21 11:14:00 │
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ HGL          │ Hengelo                   │                     │ 2023-05-21 11:32:00 │
├────────────┴────────────┴──────────────────────┴──────────────┴──────────────┴───────────────────────────┴─────────────────────┴─────────────────────┤
│ 380959 rows (40 shown)                                                                                                                     8 columns │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘


-- 也可以不顯式使用 read_csv() 函數(shù)
D SELECT * FROM "/tmp/output.csv";
┌────────────┬────────────┬──────────────────────┬──────────────┬──────────────┬───────────────────────────┬─────────────────────┬─────────────────────┐
│ service_id │    date    │         type         │ train_number │ station_code │       station_name        │   departure_time    │    arrival_time     │
│   int64    │    date    │       varchar        │    int64     │   varchar    │          varchar          │      timestamp      │      timestamp      │
├────────────┼────────────┼──────────────────────┼──────────────┼──────────────┼───────────────────────────┼─────────────────────┼─────────────────────┤
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ RTD          │ Rotterdam Centraal        │ 2023-05-15 00:00:00 │                     │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ DT           │ Delft                     │ 2023-05-15 00:13:00 │ 2023-05-15 00:13:00 │
......
......
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ HGL          │ Hengelo                   │                     │ 2023-05-21 11:32:00 │
├────────────┴────────────┴──────────────────────┴──────────────┴──────────────┴───────────────────────────┴─────────────────────┴─────────────────────┤
│ 380959 rows (40 shown)                                                                                                                     8 columns │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

     

 關(guān)于數(shù)據(jù)導(dǎo)入可以參閱官方文檔:https://duckdb.org/docs/data/overview。DuckDB 支持非常多的數(shù)據(jù)庫(kù)格式,為我們快速做數(shù)據(jù)分析提供各種便捷功能。

連接或創(chuàng)建數(shù)據(jù)庫(kù)

前面的操作都是在內(nèi)存中進(jìn)行的,也就意味著當(dāng)我們退出當(dāng)前的 DuckDB 會(huì)話(huà)時(shí),數(shù)據(jù)也會(huì)隨之釋放。DuckDB 也支持持久模式運(yùn)行,這樣數(shù)據(jù)可以存放在硬盤(pán)上面。我們可以看下 DuckDB 程序的命令行幫助:

?  knowledge git:(liucc) ? duckdb --help
Usage: duckdb [OPTIONS] FILENAME [SQL]
FILENAME is the name of an DuckDB database. A new database is created
if the file does not previously exist.
OPTIONS include:
   -append              append the database to the end of the file
   -ascii               set output mode to 'ascii'
   -bail                stop after hitting an error
   -batch               force batch I/O
   -box                 set output mode to 'box'
   -column              set output mode to 'column'
   -cmd COMMAND         run "COMMAND" before reading stdin
   -c COMMAND           run "COMMAND" and exit
   -csv                 set output mode to 'csv'
   -echo                print commands before execution
   -init FILENAME       read/process named file
   -[no]header          turn headers on or off
   -help                show this message
   -html                set output mode to HTML
   -interactive         force interactive I/O
   -json                set output mode to 'json'
   -line                set output mode to 'line'
   -list                set output mode to 'list'
   -markdown            set output mode to 'markdown'
   -newline SEP         set output row separator. Default: '\n'
   -nofollow            refuse to open symbolic links to database files
   -no-stdin            exit after processing options instead of reading stdin
   -nullvalue TEXT      set text string for NULL values. Default ''
   -quote               set output mode to 'quote'
   -readonly            open the database read-only
   -s COMMAND           run "COMMAND" and exit
   -separator SEP       set output column separator. Default: '|'
   -stats               print memory stats before each finalize
   -table               set output mode to 'table'
   -unredacted          allow printing unredacted secrets
   -unsigned            allow loading of unsigned extensions
   -version             show DuckDB version

通過(guò)命令行的幫助信息可以知道,我們可以在 duckdb 程序后面提供一個(gè) FILENAME,這個(gè) FILENAME 就是一個(gè)數(shù)據(jù)庫(kù),如果存在就打開(kāi)(連接)該庫(kù),如果該庫(kù)不存在則創(chuàng)建。

接下來(lái)我們演示一下,首先我們準(zhǔn)備一些測(cè)試數(shù)據(jù):

$ wget -c -O ~/Downloads/services-2023-10.csv.gz https://opendata.rijdendetreinen.nl/public/services/services-2023-10.csv.gz

下載完成數(shù)據(jù)之后,我們通過(guò) DuckDB 創(chuàng)建一個(gè)空的庫(kù),然后導(dǎo)入該示例數(shù)據(jù)。如下:

$ duckdb railway.db

[!tip]

該文件可以為任意擴(kuò)展名,但 .db 或 .duckdb 是兩種常見(jiàn)選擇,有時(shí)也會(huì)使用 .ddb。

進(jìn)入數(shù)據(jù)庫(kù)后,我們導(dǎo)入前面已下載的壓縮數(shù)據(jù):

D CREATE TABLE services AS FROM '~/Downloads/services-2023.csv.gz';
100% ▕████████████████████████████████████████████████████████████▏ 


-- 查看一下有哪些表
D .tables
services


-- 查看一下當(dāng)前的庫(kù)是什么,以下三種方式都可以
D .data
railway: railway.db
D .database
railway: railway.db
D .databases
railway: railway.db

上面都發(fā)生了什么?我們簡(jiǎn)單解釋一下:

我們無(wú)需顯式定義我們的 services 表的結(jié)構(gòu),也不需要使用 COPY  FROM 語(yǔ)句。DuckDB 會(huì)自動(dòng)檢測(cè)到 'services-2023.csv.gz' 是一個(gè) gzip 壓縮的 CSV 文件,因此它調(diào)用 read_csv() 函數(shù),解壓文件并根據(jù)其內(nèi)容使用 CSV 嗅探器推斷其數(shù)據(jù)結(jié)構(gòu)。

查詢(xún)利用了 DuckDB 的 FROM-first 語(yǔ)法,允許用戶(hù)省略 SELECT * 子句。因此,SQL 語(yǔ)句 FROM 'services-2023.csv.gz'; 是 SELECT * FROM 'services-2023.csv.gz'; 的簡(jiǎn)寫(xiě)。

D FROM services LIMIT 10;
┌────────────────┬──────────────┬──────────────┬─────────────────┬───┬────────────────────┬──────────────────────┬─────────────────────┬──────────────────────┬──────────────────────┐
│ Service:RDT-ID │ Service:Date │ Service:Type │ Service:Company │ … │ Stop:Arrival delay │ Stop:Arrival cance…  │ Stop:Departure time │ Stop:Departure delay │ Stop:Departure can…  │
│     int64      │     date     │   varchar    │     varchar     │   │       int64        │       boolean        │      timestamp      │        int64         │       boolean        │
├────────────────┼──────────────┼──────────────┼─────────────────┼───┼────────────────────┼──────────────────────┼─────────────────────┼──────────────────────┼──────────────────────┤
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                    │                      │ 2023-01-01 01:00:00 │                    1 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 01:13:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 01:22:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 01:40:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 02:03:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  2 │ false                │ 2023-01-01 02:12:00 │                    2 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  1 │ false                │ 2023-01-01 02:19:00 │                    3 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  3 │ false                │ 2023-01-01 02:30:00 │                    3 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  2 │ false                │                     │                      │                      │
│       10367703 │ 2023-01-01   │ Nightjet     │ NS Int          │ … │                    │                      │ 2023-01-01 01:01:00 │                    0 │ false                │
├────────────────┴──────────────┴──────────────┴─────────────────┴───┴────────────────────┴──────────────────────┴─────────────────────┴──────────────────────┴──────────────────────┤
│ 10 rows                                                                                                                                                       17 columns (9 shown) │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
  • 查詢(xún)創(chuàng)建一個(gè)名為 services 的表,并使用 CSV 讀取器的結(jié)果寫(xiě)入該表。使用 `CREATE TABLE ...AS` 語(yǔ)句。

我們看看 services 表里面有多少行數(shù)據(jù):

D SELECT count(*) AS count_services FROM services;
┌────────────────┐
│ count_services │
│     int64      │
├────────────────┤
│       21239393 │
└────────────────┘


D SELECT format('{:,}', count(*)) AS count_services FROM services;
┌────────────────┐
│ count_services │
│    varchar     │
├────────────────┤
│ 21,239,393     │
└────────────────┘

我們現(xiàn)在看下 railway.db 目前占用了多少硬盤(pán)空間:

?  softwares ll -h railway.db 
-rw-r--r--  1 liuchuan  staff   394M Jun 17 14:40 railway.db

其他數(shù)據(jù)庫(kù)集成

然 DuckDB 有 ETL 功能,那么它就可以與多個(gè)數(shù)據(jù)庫(kù)引擎進(jìn)行交互。接下來(lái)我們看下 DuckDB 與其他數(shù)據(jù)庫(kù)引擎的集成。

1.與 MySQL 集成

要直接在 MySQL 數(shù)據(jù)庫(kù)上運(yùn)行查詢(xún),需要 mysql 擴(kuò)展。可以使用 INSTALL SQL 命令安裝擴(kuò)展。只需要運(yùn)行一次即可:

D INSTALL mysql;
100% ▕████████████████████████████████████████████████████████████

要想使用 mysql 擴(kuò)展,需要使用 LOAD SQL 命令:

D LOAD mysql;

mysql 擴(kuò)展加載完成后,我們可以使用 ATTACH SQL 命令來(lái)映射到一個(gè) MySQL 實(shí)例上面。語(yǔ)法如下:

ATTACH 'host=localhost user=root port=0 database=mysqlscanner' AS mysql_db (TYPE mysql_scanner, READ_ONLY);
USE mysql_db;

ATTACH 使用的字符串是 PostgreSQL 風(fēng)格的連接字符串(不是 MySQL 連接字符串!)。這是一個(gè)以 {key}={value} 格式提供的連接參數(shù)列表。以下是有效參數(shù)列表。任何未提供的選項(xiàng)都會(huì)被其默認(rèn)值所取代。

圖片圖片

接下來(lái)是一個(gè)實(shí)際的例子,讓我們連接到本地的一個(gè) MySQL 數(shù)據(jù)庫(kù):

D ATTACH 'host=localhost user=root password=123456 port=3306 database=world' AS mysql_world_db (TYPE mysql_scanner, READ_ONLY);


-- 接下來(lái)就像是使用 MySQL 那樣來(lái)使用數(shù)據(jù)庫(kù)了
D use mysql_world_db;
D show tables;
┌─────────────────┐
│      name       │
│     varchar     │
├─────────────────┤
│ city            │
│ country         │
│ countrylanguage │
└─────────────────┘


-- 查詢(xún)一下 country 表里面的數(shù)據(jù)
D SELECT Code, Name, Region FROM country WHERE Code LIKE 'C%%';
┌─────────┬───────────────────────────────────────┬───────────────────────────┐
│  Code   │                 Name                  │          Region           │
│ varchar │                varchar                │          varchar          │
├─────────┼───────────────────────────────────────┼───────────────────────────┤
│ CAF     │ Central African Republic              │ Central Africa            │
│ CAN     │ Canada                                │ North America             │
│ CCK     │ Cocos (Keeling) Islands               │ Australia and New Zealand │
│ CHE     │ Switzerland                           │ Western Europe            │
│ CHL     │ Chile                                 │ South America             │
│ CHN     │ China                                 │ Eastern Asia              │
│ CIV     │ C?te d’Ivoire                         │ Western Africa            │
│ CMR     │ Cameroon                              │ Central Africa            │
│ COD     │ Congo, The Democratic Republic of the │ Central Africa            │
│ COG     │ Congo                                 │ Central Africa            │
│ COK     │ Cook Islands                          │ Polynesia                 │
│ COL     │ Colombia                              │ South America             │
│ COM     │ Comoros                               │ Eastern Africa            │
│ CPV     │ Cape Verde                            │ Western Africa            │
│ CRI     │ Costa Rica                            │ Central America           │
│ CUB     │ Cuba                                  │ Caribbean                 │
│ CXR     │ Christmas Island                      │ Australia and New Zealand │
│ CYM     │ Cayman Islands                        │ Caribbean                 │
│ CYP     │ Cyprus                                │ Middle East               │
│ CZE     │ Czech Republic                        │ Eastern Europe            │
├─────────┴───────────────────────────────────────┴───────────────────────────┤
│ 20 rows                                                           3 columns │
└─────────────────────────────────────────────────────────────────────────────┘

由于我們連接時(shí)指定了 READ_ONLY 選項(xiàng),那么我們是以只讀模式連接過(guò)來(lái)的,無(wú)法進(jìn)行增刪改的操作。如下:

-- 創(chuàng)建一張表
D CREATE TABLE tbl (id INTEGER, name VARCHAR);
Invalid Input Error: Cannot execute statement of type "CREATE" on database "mysql_world_db" which is attached in read-only mode!


-- 刪除一條數(shù)據(jù)
D DELETE FROM country WHERE Code = 'USA';
Invalid Input Error: Cannot execute statement of type "DELETE" on database "mysql_world_db" which is attached in read-only mode!

[!tip]

以讀寫(xiě)模式連接數(shù)據(jù)庫(kù):只需設(shè)置 (TYPE MYSQL) 即可,去掉 READ_ONLY。

關(guān)于與 MySQL 集成相關(guān)的更詳細(xì)信息,還請(qǐng)參閱官方文檔:https://duckdb.org/docs/extensions/mysql.html#supported-operations。

2.與 PostgreSQL 集成

與集成 MySQL 一樣,需要先安裝擴(kuò)展,然后加載。

D INSTALL postgres;
100% ▕████████████████████████████████████████████████████████████


D LOAD postgres;

安裝 postgres 擴(kuò)展后,可以使用 postgres_scan 函數(shù)從 PostgreSQL 查詢(xún)表:

-- scan the table "mytable" from the schema "public" in the database "mydb"
SELECT * FROM postgres_scan('host=localhost port=5432 dbname=mydb', 'public', 'mytable');

“postgres_scan” 函數(shù)的第一個(gè)參數(shù)是 [PostgreSQL 連接字符串](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING),

這是以 “{key}={value}” 格式提供的連接參數(shù)列表。下面是詳細(xì)的參數(shù)列表。

圖片圖片

接下來(lái)我們連接到本地的一個(gè) PostgreSQL 數(shù)據(jù)庫(kù)上面進(jìn)行一個(gè)查詢(xún):

D SELECT * FROM postgres_scan('host=localhost port=5432 user=forum password=forum dbname=forumdb', 'forum', 'categories');
┌───────┬───────────────────────┬──────────────────────────────────┐
│  pk   │         title         │           description            │
│ int32 │        varchar        │             varchar              │
├───────┼───────────────────────┼──────────────────────────────────┤
│     3 │ Programming Languages │ All about programming languages  │
│     5 │ Software engineering  │ Software engineering discussions │
│     1 │ Database Discussions  │ Database discussions             │
│     2 │ Unix/Linux discussion │ Unix and Linux discussions       │
│     4 │ A.I                   │ Machine Learning discussions     │
└───────┴───────────────────────┴──────────────────────────────────┘

或者,可以使用 ATTACH 命令連接整個(gè)數(shù)據(jù)庫(kù)。這允許我們像查詢(xún)常規(guī)數(shù)據(jù)庫(kù)一樣查詢(xún)存儲(chǔ)在 PostgreSQL 數(shù)據(jù)庫(kù)中的所有表。語(yǔ)法如下:

-- Attach the Postgres database using the given connection string
ATTACH 'host=localhost port=5432 dbname=mydb' AS test (TYPE postgres);
-- The table "tbl_name" can now be queried as if it is a regular table
SELECT * FROM test.tbl_name;
-- Switch the active database to "test"
USE test;


-- List all tables in the file
SHOW TABLES;

一個(gè)實(shí)際的例子:

D ATTACH 'host=localhost port=5432 user=forum password=forum dbname=forumdb' AS pg_forum_db (TYPE postgres);
D use pg_forum_db;


-- 查詢(xún)數(shù)據(jù)
D SELECT * from forum.categories;
┌───────┬───────────────────────┬──────────────────────────────────┐
│  pk   │         title         │           description            │
│ int32 │        varchar        │             varchar              │
├───────┼───────────────────────┼──────────────────────────────────┤
│     3 │ Programming Languages │ All about programming languages  │
│     5 │ Software engineering  │ Software engineering discussions │
│     1 │ Database Discussions  │ Database discussions             │
│     2 │ Unix/Linux discussion │ Unix and Linux discussions       │
│     4 │ A.I                   │ Machine Learning discussions     │
└───────┴───────────────────────┴──────────────────────────────────┘

由于我們?cè)谟成鋽?shù)據(jù)庫(kù)時(shí)并沒(méi)有使用 READ_ONLY 選項(xiàng),因此可以對(duì) pg_forum_db 進(jìn)行讀寫(xiě)操作。如下:

D CREATE TABLE forum.demo (id INTEGER, name VARCHAR);
D DESCRIBE forum.demo;
┌─────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type │  null   │   key   │ default │  extra  │
│   varchar   │   varchar   │ varchar │ varchar │ varchar │ varchar │
├─────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ id          │ INTEGER     │ YES     │         │         │         │
│ name        │ VARCHAR     │ YES     │         │         │         │
└─────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘


-- 插入一條數(shù)據(jù)
D INSERT INTO forum.demo VALUES (42, 'DuckDB');


-- 查看該數(shù)據(jù)
D FROM forum.demo;
┌───────┬─────────┐
│  id   │  name   │
│ int32 │ varchar │
├───────┼─────────┤
│    42 │ DuckDB  │
└───────┴─────────┘


-- 修改該數(shù)據(jù)
D UPDATE forum.demo set id=9 WHERE name='DuckDB';
D FROM forum.demo;
┌───────┬─────────┐
│  id   │  name   │
│ int32 │ varchar │
├───────┼─────────┤
│     9 │ DuckDB  │
└───────┴─────────┘


-- 刪除該數(shù)據(jù)
D DELETE FROM forum.demo WHERE id=9;
D FROM forum.demo;
┌───────┬─────────┐
│  id   │  name   │
│ int32 │ varchar │
├───────┴─────────┤
│     0 rows      │
└─────────────────┘


-- 刪除該表
D DROP TABLE forum.demo;
D DESCRIBE forum.demo;
Catalog Error: Table with name demo does not exist!
Did you mean "mysql_world_db.mysql.db"?

可以檢查下我們目前都連接了哪些數(shù)據(jù)庫(kù):

D show databases;
┌────────────────┐
│ database_name  │
│    varchar     │
├────────────────┤
│ mysql_world_db │
│ pg_forum_db    │
│ railway        │
└────────────────┘


D .databases
railway: railway.db
mysql_world_db: host=localhost user=root password=123456 port=3306 database=world
pg_forumd_db: host=localhost port=5432 user=forum password=forum dbname=forumdb

關(guān)于與 PostgreSQL 集成更詳細(xì)的信息可以參閱官方文檔:https://duckdb.org/docs/extensions/postgres.html。

DuckDB 還能與 SQLite 進(jìn)行集成,這里就不再演示了,可以參閱官方文檔:https://duckdb.org/docs/guides/database_integration/sqlite。

擴(kuò)展支持

一個(gè)產(chǎn)品強(qiáng)或系統(tǒng)不強(qiáng),關(guān)鍵還是要看下擴(kuò)展多不多。正所謂:“功能不夠,擴(kuò)展來(lái)湊”。我們看下缺省狀態(tài)下 DuckDB 支持的擴(kuò)展:

不同的 DuckDB 客戶(hù)端都附帶了一組不同的擴(kuò)展。我們?cè)谙卤碇羞M(jìn)行一個(gè)比對(duì):

圖片圖片

關(guān)于官方提供的擴(kuò)展,可以參閱官方文檔:https://duckdb.org/docs/extensions/official_extensions。

可以查看當(dāng)前 DuckDB 已安裝的擴(kuò)展:

D .mode line
D SELECT * FROM duckdb_extensions();
   extension_name = arrow
           loaded = false
        installed = false
     install_path = 
      description = A zero-copy data integration between Apache Arrow and DuckDB
          aliases = []
extension_version = 
     install_mode = 
   installed_from = 


   extension_name = autocomplete
           loaded = true
        installed = true
     install_path = (BUILT-IN)
      description = Adds support for autocomplete in the shell
          aliases = []
extension_version = 
     install_mode = STATICALLY_LINKED
   installed_from = 


......
......


   extension_name = vss
           loaded = false
        installed = false
     install_path = 
      description = Adds indexing support to accelerate Vector Similarity Search
          aliases = []
extension_version = 
     install_mode = 
   installed_from =

客戶(hù)端API

DuckDB 還支持豐富的客戶(hù)端 API,允許我們通過(guò)程序來(lái)使用 DuckDB。接下來(lái)我們以 Golang 為例進(jìn)行一個(gè)演示。代碼如下:

package main


import (
  "database/sql"
  "errors"
  "fmt"
  "log"


  _ "github.com/marcboeker/go-duckdb"
)


func main() {
  db, err := sql.Open("duckdb", "")
  if err != nil {
    log.Fatal(err)
  }
  defer db.Close()


  _, err = db.Exec(`CREATE TABLE people (id INTEGER, name VARCHAR)`)
  if err != nil {
    log.Fatal(err)
  }
  _, err = db.Exec(`INSERT INTO people VALUES (42, 'John')`)
  if err != nil {
    log.Fatal(err)
  }


  var (
    id   int
    name string
  )
  row := db.QueryRow(`SELECT id, name FROM people`)
  err = row.Scan(&id, &name)
  if errors.Is(err, sql.ErrNoRows) {
    log.Println("no rows")
  } else if err != nil {
    log.Fatal(err)
  }


  fmt.Printf("id: %d, name: %s\n", id, name)
}

接下來(lái)我們進(jìn)行編譯:

$ mkdir myduck
$ mv main.go myduck/
$ go mod init
$ go mod tidy
go: finding module for package github.com/marcboeker/go-duckdb
go: downloading github.com/marcboeker/go-duckdb v1.7.0
go: found github.com/marcboeker/go-duckdb in github.com/marcboeker/go-duckdb v1.7.0
go: downloading github.com/apache/arrow/go/v14 v14.0.2
go: downloading github.com/google/uuid v1.3.1
go: downloading golang.org/x/tools v0.14.0
go: downloading github.com/google/flatbuffers v23.5.26+incompatible
go: downloading github.com/klauspost/compress v1.16.7
go: downloading github.com/zeebo/xxh3 v1.0.2
go: downloading github.com/pierrec/lz4/v4 v4.1.18
go: downloading golang.org/x/mod v0.13.0
go: downloading github.com/klauspost/cpuid/v2 v2.2.5
go: downloading golang.org/x/exp v0.0.0-20231006140011-7918f672742d
go: downloading gonum.org/v1/gonum v0.12.0
go: downloading github.com/zeebo/assert v1.3.0


$ go build main.go 
$ ll -h
total 81496
-rw-r--r--  1 liuchuan  staff   678B Jun 17 16:53 go.mod
-rw-r--r--  1 liuchuan  staff   3.8K Jun 17 16:53 go.sum
-rwxr-xr-x  1 liuchuan  staff    40M Jun 17 16:54 main   # 編譯出來(lái)的文件還是挺大的
-rw-r--r--  1 liuchuan  staff   678B Jun 17 16:52 main.go

我們運(yùn)行一下代碼:

$ ./main 
id: 42, name: John

關(guān)于更詳細(xì)的客戶(hù)端 API 信息,可以參閱官方文檔:https://duckdb.org/docs/api/overview。

總結(jié)

另外,官方文檔就是一個(gè)寶庫(kù),有著非常豐富的說(shuō)明及示例,網(wǎng)址為:https://duckdb.org/docs/index。要想深入理解及掌握 DuckDB,需要多讀讀官方文檔。

綜上所述,DuckDB 作為一款集輕量級(jí)、高性能于一體的嵌入式分析型數(shù)據(jù)庫(kù),在實(shí)時(shí)分析、數(shù)據(jù)倉(cāng)庫(kù)、嵌入式應(yīng)用和大數(shù)據(jù)預(yù)處理等領(lǐng)域都展現(xiàn)出了其獨(dú)特的優(yōu)勢(shì)。其內(nèi)存優(yōu)化特性、低延遲性能和靈活的集成方式使得它成為各類(lèi)應(yīng)用系統(tǒng)中的理想選擇。隨著數(shù)據(jù)分析和處理需求的不斷增長(zhǎng),相信 DuckDB 將在未來(lái)繼續(xù)發(fā)揮重要作用,為各行各業(yè)提供更高效、更可靠的數(shù)據(jù)支持。

如有相關(guān)問(wèn)題,請(qǐng)?jiān)谖恼潞竺娼o小編留言,小編安排作者第一時(shí)間和您聯(lián)系,為您答疑解惑。

責(zé)任編輯:武曉燕 來(lái)源: 新鈦云服
相關(guān)推薦

2023-03-29 08:26:06

2022-02-23 08:41:58

NATIPv4IPv6

2022-08-01 07:57:03

數(shù)組操作內(nèi)存

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-06-30 08:18:51

敏捷開(kāi)發(fā)模式

2023-09-10 21:42:31

2022-05-24 08:21:16

數(shù)據(jù)安全API

2021-08-27 07:06:10

IOJava抽象

2024-02-20 21:34:16

循環(huán)GolangGo

2024-09-27 09:56:43

2022-05-26 00:19:29

通信信息5G

2024-11-28 09:57:50

C#事件發(fā)布器

2021-08-12 07:49:24

mysql

2023-07-24 09:41:08

自動(dòng)駕駛技術(shù)交通

2022-10-08 00:00:05

SQL機(jī)制結(jié)構(gòu)

2024-07-26 09:47:28

2022-09-22 08:06:29

計(jì)算機(jī)平板微信

2023-03-26 23:47:32

Go內(nèi)存模型

2022-11-12 12:33:38

CSS預(yù)處理器Sass
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 麻豆国产一区二区三区四区 | 国产一区二区三区在线视频 | 天天干天天想 | 午夜不卡福利视频 | 久久久涩| 国产成人精品一区二区三区在线 | 亚洲欧美一区二区三区国产精品 | 国产亚洲人成a在线v网站 | 成人免费观看男女羞羞视频 | 精品欧美二区 | 欧美福利视频一区 | 欧美成人免费电影 | 亚洲欧美中文日韩在线v日本 | 亚洲成人一区二区 | 日韩国产在线 | 欧美性生活一区二区三区 | 久草99 | 精品国产乱码久久久久久影片 | 日韩在线不卡视频 | 亚洲精品久久久蜜桃 | 国产精品久久久久久久久久免费看 | 国产精品久久久久久久久久软件 | 久久久久久国产精品 | 日韩在线观看精品 | 美女爽到呻吟久久久久 | av在线电影网 | 午夜视频一区二区三区 | 欧美区在线 | 亚洲成人高清 | 国产视频精品免费 | 久草视频在线播放 | 涩涩视频在线看 | 日本二区 | 91精品国产乱码久久久久久久久 | 中文字幕免费在线观看 | 久久精品亚洲欧美日韩精品中文字幕 | 久久久亚洲一区 | 日韩色在线 | 色综合久久久 | 成人一级视频在线观看 | 欧美成人h版在线观看 |