精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我們一起聊聊 DuckDB 是什么及適用場景

數據庫 其他數據庫
官方文檔就是一個寶庫,有著非常豐富的說明及示例,網址為:https://duckdb.org/docs/index。要想深入理解及掌握 DuckDB,需要多讀讀官方文檔。

DuckDB 是一款集輕量級、高性能于一體的嵌入式分析型數據庫,以其卓越的數據查詢和分析能力在數據庫領域嶄露頭角。這款基于C++ 編寫的數據庫,以其先進的設計理念和高效的存儲引擎,為大規模數據處理提供了強有力的支持。

DuckDB 采用了獨特的列式存儲方式,相較于傳統的行式存儲,這種存儲方式能更加高效地讀取和分析數據。通過將相同列的數據集中存儲在連續的物理位置,列式存儲顯著提升了數據的訪問速度。此外,DuckDB 還利用壓縮算法進一步減少了存儲空間需求,降低了 I/O 開銷,讓數據處理變得更加輕松高效。

在查詢優化和執行方面,DuckDB 同樣表現出色。它支持標準的 SQL 查詢語言,允許用戶通過簡潔明了的 SQL 語句實現復雜的數據查詢和分析任務。其優化的執行引擎充分利用內存優勢,提供高并發和低延遲的查詢體驗。同時,DuckDB 還內置了多種查詢優化技術,通過智能地選擇查詢路徑和減少數據掃描量,進一步提高查詢效率。

作為一款嵌入式數據庫,DuckDB 還具備良好的集成性。它提供了豐富的 API 接口,使開發者能夠輕松地將 DuckDB 嵌入到各種應用程序中,實現無縫的數據管理和查詢功能。這種高度的靈活性使得 DuckDB 成為各類應用系統中的理想選擇。

DuckDB 的適用場景

1.實時分析

在追求速度和響應能力的實時分析領域,DuckDB 以其高性能和低延遲的特性成為不可或缺的工具。無論是監控系統、實時報表還是預警系統,DuckDB 都能快速響應大量的數據查詢請求,提供準確而及時的分析結果。這使得企業能夠實時掌握業務動態,做出快速而明智的決策。

此外,DuckDB 的內存優化特性進一步提升了實時分析的效率。通過將盡可能多的數據加載到內存中,DuckDB 能夠顯著減少磁盤 I/O 操作,從而加快查詢速度。這種優勢在處理大規模數據集時尤為明顯,讓實時分析變得更加輕松高效。

2.數據倉庫

DuckDB 同樣適用于構建和管理數據倉庫系統。作為輕量級的數據倉庫解決方案,它能夠輕松應對數據整合、清洗和轉換等復雜任務。通過 ETL 過程,DuckDB 能夠將來自不同數據源的數據整合到一起,形成統一的數據視圖。然后,用戶可以利用其強大的查詢和分析能力,深入挖掘數據的價值,發現潛在的商業機會。

相較于傳統的大型關系型數據庫,DuckDB 在數據倉庫場景中具有更低的部署和維護成本。其輕量級特性使得數據倉庫的構建和管理變得更加簡單高效,無需投入大量的人力和物力資源。同時,DuckDB 的高性能和可擴展性也能夠滿足大型數據倉庫的需求,確保數據的快速處理和查詢。

3.嵌入式應用

DuckDB 的嵌入式特性使其成為嵌入式應用的理想選擇。無論是物聯網設備還是移動應用程序,都可以通過集成 DuckDB 實現本地數據分析能力。這意味著設備或應用程序可以直接在本地處理和分析數據,無需依賴遠程服務器或云端資源。

在物聯網設備中,DuckDB 可以幫助實現實時的數據采集和分析,提升設備的智能化水平。在移動應用程序中,它可以用于存儲和分析用戶數據,提供個性化的服務和推薦,提升用戶體驗。

4.大數據預處理

大數據預處理是數據挖掘和機器學習流程中不可或缺的一環。在這一環節中,DuckDB 同樣可以發揮重要作用。它能夠高效地對數據進行清洗、轉換和聚合等操作,為后續的機器學習或數據挖掘任務提供高質量的輸入數據。

DuckDB 支持各種復雜的 SQL 查詢和聚合操作,使得預處理工作變得更加簡單高效。用戶可以通過編寫SQL語句來定義數據轉換規則和處理邏輯,然后讓 DuckDB 自動完成這些任務。這大大減輕了數據科學家的工作負擔,讓他們能夠更專注于數據分析和模型構建等核心任務。

接下來我們就理論聯系實際地使用一下 DuckDB,看看它有什么驚艷的地方。

安裝及簡單使用

# MacOS 安裝
$ brew install duckdb


# Python 安裝
pip install duckdb


# NodeJS 安裝
npm install duckdb


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

安裝完成后,怎么使用呢?可以打開命令行直接輸入 "duckdb" 即可進入其命令行界面:

(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.


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


-- 下面的是官方的 Live Demo 中的一個示例,從 S3 存儲上面下載了一個數據文件,并導入到 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 │
└────────────────┘
-- 或者執行 .tables 也可以查看有哪些表
D .tables
train_services

如何查看表結構呢?

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

查詢 train_services 表的前 10 條數據:

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 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

還可以設置輸出樣式,默認是 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    |                     |                     |
+------------+------------+-----------+--------------+--------------+----------------------+---------------------+---------------------+

還可以獲取命令的幫助,進入 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

導出CSV文件

可以輕松地把數據導出到 CSV 文件:

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


-- 查看文件前 10 行內容
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

查詢的數據也可以導出到 CSV 文件:

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

導入CSV文件

導入 CSV 文件有多種方式:

-- 通過 read_csv() 函數直接讀取 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() 函數
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 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

     

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

連接或創建數據庫

前面的操作都是在內存中進行的,也就意味著當我們退出當前的 DuckDB 會話時,數據也會隨之釋放。DuckDB 也支持持久模式運行,這樣數據可以存放在硬盤上面。我們可以看下 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

通過命令行的幫助信息可以知道,我們可以在 duckdb 程序后面提供一個 FILENAME,這個 FILENAME 就是一個數據庫,如果存在就打開(連接)該庫,如果該庫不存在則創建。

接下來我們演示一下,首先我們準備一些測試數據:

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

下載完成數據之后,我們通過 DuckDB 創建一個空的庫,然后導入該示例數據。如下:

$ duckdb railway.db

[!tip]

該文件可以為任意擴展名,但 .db 或 .duckdb 是兩種常見選擇,有時也會使用 .ddb。

進入數據庫后,我們導入前面已下載的壓縮數據:

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


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


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

上面都發生了什么?我們簡單解釋一下:

我們無需顯式定義我們的 services 表的結構,也不需要使用 COPY  FROM 語句。DuckDB 會自動檢測到 'services-2023.csv.gz' 是一個 gzip 壓縮的 CSV 文件,因此它調用 read_csv() 函數,解壓文件并根據其內容使用 CSV 嗅探器推斷其數據結構。

查詢利用了 DuckDB 的 FROM-first 語法,允許用戶省略 SELECT * 子句。因此,SQL 語句 FROM 'services-2023.csv.gz'; 是 SELECT * FROM 'services-2023.csv.gz'; 的簡寫。

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) │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
  • 查詢創建一個名為 services 的表,并使用 CSV 讀取器的結果寫入該表。使用 `CREATE TABLE ...AS` 語句。

我們看看 services 表里面有多少行數據:

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     │
└────────────────┘

我們現在看下 railway.db 目前占用了多少硬盤空間:

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

其他數據庫集成

然 DuckDB 有 ETL 功能,那么它就可以與多個數據庫引擎進行交互。接下來我們看下 DuckDB 與其他數據庫引擎的集成。

1.與 MySQL 集成

要直接在 MySQL 數據庫上運行查詢,需要 mysql 擴展。可以使用 INSTALL SQL 命令安裝擴展。只需要運行一次即可:

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

要想使用 mysql 擴展,需要使用 LOAD SQL 命令:

D LOAD mysql;

mysql 擴展加載完成后,我們可以使用 ATTACH SQL 命令來映射到一個 MySQL 實例上面。語法如下:

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

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

圖片圖片

接下來是一個實際的例子,讓我們連接到本地的一個 MySQL 數據庫:

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


-- 接下來就像是使用 MySQL 那樣來使用數據庫了
D use mysql_world_db;
D show tables;
┌─────────────────┐
│      name       │
│     varchar     │
├─────────────────┤
│ city            │
│ country         │
│ countrylanguage │
└─────────────────┘


-- 查詢一下 country 表里面的數據
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 │
└─────────────────────────────────────────────────────────────────────────────┘

由于我們連接時指定了 READ_ONLY 選項,那么我們是以只讀模式連接過來的,無法進行增刪改的操作。如下:

-- 創建一張表
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!


-- 刪除一條數據
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]

以讀寫模式連接數據庫:只需設置 (TYPE MYSQL) 即可,去掉 READ_ONLY。

關于與 MySQL 集成相關的更詳細信息,還請參閱官方文檔:https://duckdb.org/docs/extensions/mysql.html#supported-operations。

2.與 PostgreSQL 集成

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

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


D LOAD postgres;

安裝 postgres 擴展后,可以使用 postgres_scan 函數從 PostgreSQL 查詢表:

-- 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” 函數的第一個參數是 [PostgreSQL 連接字符串](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING),

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

圖片圖片

接下來我們連接到本地的一個 PostgreSQL 數據庫上面進行一個查詢:

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 命令連接整個數據庫。這允許我們像查詢常規數據庫一樣查詢存儲在 PostgreSQL 數據庫中的所有表。語法如下:

-- 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;

一個實際的例子:

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


-- 查詢數據
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     │
└───────┴───────────────────────┴──────────────────────────────────┘

由于我們在映射數據庫時并沒有使用 READ_ONLY 選項,因此可以對 pg_forum_db 進行讀寫操作。如下:

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     │         │         │         │
└─────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘


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


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


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


-- 刪除該數據
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"?

可以檢查下我們目前都連接了哪些數據庫:

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

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

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

擴展支持

一個產品強或系統不強,關鍵還是要看下擴展多不多。正所謂:“功能不夠,擴展來湊”。我們看下缺省狀態下 DuckDB 支持的擴展:

不同的 DuckDB 客戶端都附帶了一組不同的擴展。我們在下表中進行一個比對:

圖片圖片

關于官方提供的擴展,可以參閱官方文檔:https://duckdb.org/docs/extensions/official_extensions。

可以查看當前 DuckDB 已安裝的擴展:

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 =

客戶端API

DuckDB 還支持豐富的客戶端 API,允許我們通過程序來使用 DuckDB。接下來我們以 Golang 為例進行一個演示。代碼如下:

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)
}

接下來我們進行編譯:

$ 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   # 編譯出來的文件還是挺大的
-rw-r--r--  1 liuchuan  staff   678B Jun 17 16:52 main.go

我們運行一下代碼:

$ ./main 
id: 42, name: John

關于更詳細的客戶端 API 信息,可以參閱官方文檔:https://duckdb.org/docs/api/overview。

總結

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

綜上所述,DuckDB 作為一款集輕量級、高性能于一體的嵌入式分析型數據庫,在實時分析、數據倉庫、嵌入式應用和大數據預處理等領域都展現出了其獨特的優勢。其內存優化特性、低延遲性能和靈活的集成方式使得它成為各類應用系統中的理想選擇。隨著數據分析和處理需求的不斷增長,相信 DuckDB 將在未來繼續發揮重要作用,為各行各業提供更高效、更可靠的數據支持。

如有相關問題,請在文章后面給小編留言,小編安排作者第一時間和您聯系,為您答疑解惑。

責任編輯:武曉燕 來源: 新鈦云服
相關推薦

2023-03-29 08:26:06

2022-02-23 08:41:58

NATIPv4IPv6

2022-08-01 07:57:03

數組操作內存

2023-06-30 08:18:51

敏捷開發模式

2023-08-10 08:28:46

網絡編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數據安全API

2023-09-10 21:42:31

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2024-09-27 09:56:43

2022-05-26 00:19:29

通信信息5G

2024-07-26 09:47:28

2022-10-08 00:00:05

SQL機制結構

2022-09-22 08:06:29

計算機平板微信

2024-11-28 09:57:50

C#事件發布器

2021-08-12 07:49:24

mysql

2023-07-24 09:41:08

自動駕駛技術交通

2023-03-26 23:47:32

Go內存模型

2023-07-27 07:46:51

SAFe團隊測試
點贊
收藏

51CTO技術棧公眾號

欧美一区激情视频在线观看| 久久亚洲私人国产精品va| 丝袜老师办公室里做好紧好爽| 色综合视频在线| 青娱乐精品在线视频| 久热在线中文字幕色999舞| 手机免费看av片| 日韩欧美2区| 亚洲一区二区欧美| 亚洲v国产v在线观看| 精品国产无码AV| 乱人伦精品视频在线观看| 久久香蕉国产线看观看网| 中文人妻一区二区三区| 国产精品美女久久久久人| 黄色一区二区在线| 色撸撸在线观看| 欧美在线观看在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩欧美一级大片| 欧美日韩一视频区二区| 伊是香蕉大人久久| 手机在线成人av| 免费成人高清在线视频| 欧美日韩激情网| 大陆极品少妇内射aaaaaa| 国外av在线| 99久久伊人网影院| 电影午夜精品一区二区三区| 曰批又黄又爽免费视频| 久久av最新网址| 久久久爽爽爽美女图片| 亚洲色婷婷一区二区三区| 成人午夜av| 亚洲桃花岛网站| 亚洲观看黄色网| theporn国产在线精品| 在线成人av网站| 国产日产欧美视频| 国产高清视频色在线www| 亚洲精品久久7777| 一级黄色片播放| 黄色在线观看网站| 国产精品久久久久久久久晋中 | 国产精品人人做人人爽| 久久精品亚洲无码| 国产精品v日韩精品v欧美精品网站| www.欧美精品| 国产黄色录像片| 日韩.com| 久久大大胆人体| 在线观看黄网址| 希岛爱理一区二区三区| 精品国产一区二区三区在线观看 | 日韩欧美在线国产| 久久久久久久久久久福利| 深夜av在线| 欧美日韩一区二区在线 | 久久国产精品波多野结衣| 欧美在线三级| 久久久午夜视频| 97人人澡人人爽人人模亚洲| 亚洲免费大片| 日本最新高清不卡中文字幕| 亚洲中文无码av在线| 乱一区二区av| 91久久久久久| 性欧美一区二区三区| 成人精品视频网站| 老牛影视免费一区二区| 国产黄色在线| 最新高清无码专区| 亚洲色婷婷久久精品av蜜桃| 变态调教一区二区三区| 欧美性xxxxx极品| 91人人澡人人爽人人精品| 日本免费在线一区| 日韩欧美综合在线| 波多野结衣影院| 精品国产乱码| 中文字幕日韩欧美在线视频| 久久人妻无码aⅴ毛片a片app| 91精品国产调教在线观看| 久久久久久久一区二区| 午夜婷婷在线观看| 美国毛片一区二区| 成人在线免费网站| 国产系列在线观看| 亚洲精品久久久蜜桃| 日韩av一二三四区| 欧美啪啪网站| 亚洲第一精品夜夜躁人人爽| 国产精品理论在线| 欧美日韩免费| 国产精品欧美一区二区| 日韩有码第一页| 国产精品理伦片| av免费观看大全| 欧美综合影院| 亚洲精品一区二三区不卡| 黑人操日本美女| 在线亚洲自拍| 亚洲在线免费看| 九一国产在线| 性欧美疯狂xxxxbbbb| 国产成人黄色网址| 亚洲成人一品| 欧美激情视频一区二区三区不卡 | 91精品国产入口在线| 日韩在线免费观看av| 一个色综合网| 国产精品揄拍一区二区| 偷拍自拍在线| 亚洲一区在线看| 亚洲一区精品视频在线观看| 午夜先锋成人动漫在线| 欧美黄色片免费观看| 亚洲天堂狠狠干| 久久婷婷国产综合精品青草| 国产免费黄色小视频| 国产精品亚洲四区在线观看| 夜夜嗨av一区二区三区四区| 久久精品视频7| 成人精品在线视频观看| 欧美一级黄色录像片| 天天综合网站| 日韩精品免费观看| 国产成人精品亚洲男人的天堂| 国产综合色产在线精品| 色999日韩自偷自拍美女| 中文字幕 在线观看| 亚洲国产精品久久久久秋霞不卡| 久久久久久久久久久久久女过产乱| 免费看黄色91| 日韩性感在线| 亚洲四虎影院| 亚洲视频在线观看视频| 欧美精品二区三区| 不卡一区在线观看| 国产一二三在线视频| 日韩视频1区| 欧美裸体xxxx极品少妇| 99热这里精品| 尤物视频一区二区| 91精品国产高清91久久久久久| 欧美一区网站| 999国产视频| 欧美黑人猛交| 欧美精品一区男女天堂| 日韩伦理在线视频| 91免费国产在线| 国产偷人视频免费| 视频国产一区| 国产精品自拍视频| 国产在线激情| 精品日韩在线观看| 欧美三日本三级少妇99| jlzzjlzz国产精品久久| 国产成人精品视频免费看| 亚欧洲精品视频在线观看| 日本精品久久久久久久| 国产精品秘入口| 欧美日韩一级视频| 91在线播放观看| www.av亚洲| 国产成人av影视| 国产精品成人一区二区不卡| 亚洲一区二区少妇| 91精品国产黑色瑜伽裤| 亚洲美女性生活视频| 中文字幕在线网址| 一级精品视频在线观看宜春院| 亚洲911精品成人18网站| 99精品视频免费| 清纯唯美一区二区三区| 青青国产精品| 久久久免费精品视频| 精品美女视频在线观看免费软件| 欧美日韩亚洲国产综合| 欧美成人一二三区| 99在线热播精品免费| 免费激情视频在线观看| 欧美 日韩 国产 一区| 精品婷婷色一区二区三区蜜桃| 午夜欧美巨大性欧美巨大| 日韩一级裸体免费视频| 丰满人妻妇伦又伦精品国产| 色播五月激情综合网| xxxx日本少妇| 久久在线观看免费| 亚洲男人天堂2021| 午夜在线一区| 国产女主播av| 欧美日韩一二| 国产精品永久入口久久久| 视频一区在线免费看| 欧美大片欧美激情性色a∨久久| 蜜桃视频在线观看视频| 日韩视频永久免费| 69视频免费看| 亚洲成人中文在线| 国产在线免费看| 久久青草欧美一区二区三区| 欧洲美女亚洲激情| 日韩电影免费一区| 亚洲色成人www永久在线观看| 国产中文精品久高清在线不| 波多野结衣久草一区| 久久精品国产精品亚洲毛片| 午夜精品美女自拍福到在线| 精品自拍一区| 在线亚洲欧美视频| 手机福利在线| 精品国产露脸精彩对白 | 亚洲人免费短视频| 久久久久久高潮国产精品视| 国产精品va在线观看视色| 亚洲欧美制服丝袜| 天堂网2014av| 精品国产乱码久久久久久1区2区| 91丨九色丨蝌蚪丨对白| 在线免费精品视频| 亚洲熟妇无码乱子av电影| 亚洲国产精品精华液网站| 午夜写真片福利电影网| 日韩一区在线播放| 美国美女黄色片| 久久精品无码一区二区三区| 国产不卡一二三| 床上的激情91.| 国产调教打屁股xxxx网站| 激情伊人五月天久久综合| 黄色三级视频在线| 日韩主播视频在线| 久草精品在线播放| 奶水喷射视频一区| 亚洲视频在线a| 三级一区在线视频先锋 | 99麻豆久久久国产精品免费优播| 下面一进一出好爽视频| 国产一区二区三区av电影| 久久撸在线视频| 麻豆久久一区二区| 亚洲一区二区三区四区五区| 裸体一区二区三区| 亚洲激情在线看| 国产一区二区在线观看视频| 成人免费黄色av| 国产乱一区二区| av影片在线播放| 成人免费毛片app| 国产一线在线观看| 久久伊99综合婷婷久久伊| 精品人妻一区二区三区香蕉| 久久色在线视频| 免费成人深夜天涯网站| 国产精品嫩草影院com| 国产白丝一区二区三区| 亚洲视频一区在线| 久久久久久免费观看| 亚洲va欧美va国产va天堂影院| 国产精品第9页| 在线观看av一区| 亚洲在线视频播放| 日韩欧美一区二区三区在线| 欧美一级一区二区三区| 精品亚洲国产成av人片传媒| 国产在线视频资源| 日韩中文字幕在线| 婷婷在线播放| 91精品国产乱码久久久久久蜜臀| 欧美极度另类| 91亚洲精品在线| 欧美aaaaa级| 影音先锋亚洲视频| 影音国产精品| 亚洲天堂av线| 国产丶欧美丶日本不卡视频| 五级黄高潮片90分钟视频| 欧美高清在线视频| 久久久国产精华液| 色婷婷综合久久久久中文| 国产精品国产精品国产专区| 精品剧情v国产在线观看在线| 丝袜视频国产在线播放| 日韩一区二区av| 国产高清自产拍av在线| 成人av色在线观看| 日韩欧美黄色| 麻豆md0077饥渴少妇| 免费永久网站黄欧美| 手机精品视频在线| 久久久不卡网国产精品一区| 国产人妻精品一区二区三区不卡| 欧美色视频日本高清在线观看| 91成品人影院| 亚洲精品综合精品自拍| 91网址在线观看| 国产精品91久久久| 成人午夜大片| 亚洲 欧洲 日韩| 久久亚洲图片| av电影中文字幕| 国产精品丝袜久久久久久app| 国产系列精品av| 91精品国产综合久久久蜜臀图片| 极品美乳网红视频免费在线观看| 欧美另类极品videosbestfree| 日韩精品免费观看视频| 国产乱码精品一区二区三区日韩精品 | 狠狠色丁香久久婷婷综| 亚洲熟妇一区二区三区| 亚洲国产精品人人做人人爽| 国产深喉视频一区二区| 国产亚洲综合久久| 深夜成人在线| 国产一区二区在线观看免费播放| 欧美freesex交免费视频| 亚洲欧美国产日韩综合| 久久久国产精品午夜一区ai换脸| 久久伊人成人网| 欧美一区二区三区白人| 色老头视频在线观看| 国产精品久久久久久久9999| 欧美电影在线观看免费| www精品久久| 粉嫩一区二区三区性色av| tube国产麻豆| 91精品国产综合久久蜜臀| 精品176二区| 成人精品一区二区三区| 日韩欧美精品一区| 国产九九在线视频| 欧美激情综合五月色丁香小说| 久久久久亚洲av成人毛片韩| 国产视频精品免费播放| 日本在线播放一二三区| 久久福利电影| 99re国产精品| 偷拍女澡堂一区二区三区| 五月天婷婷综合| 天堂а√在线8种子蜜桃视频 | www.亚洲免费av| 国产成人在线免费观看视频| 亚洲国产美女精品久久久久∴| 波多野在线观看| 国产精品theporn88| 最新日韩av| 免费在线观看你懂的| 一本高清dvd不卡在线观看 | 欧美成人免费网| 国产午夜亚洲精品一级在线| 亚洲黄色网址在线观看| 国产成人综合视频| 日本五十熟hd丰满| 亚洲国产精品资源| 黄色成人免费网| 视频一区视频二区视频三区视频四区国产 | 欧美日韩在线一区二区| 在线国产91| 97se亚洲综合在线| 亚洲欧美成人| 国产一二三四区在线| 欧美美女网站色| av中文字幕电影在线看| 欧美激情专区| 看电视剧不卡顿的网站| 中文字幕亚洲欧美日韩| 亚洲第一精品自拍| 日本电影欧美片| 天天爱天天做天天操| 成人性生交大片免费看视频在线| 国产无遮挡呻吟娇喘视频| 中文字幕精品一区二区精品| 午夜不卡一区| 国产精品专区在线| 日本一区二区不卡视频| 精品国产18久久久久久| 91sa在线看| 91亚洲人成网污www| 制服丝袜在线第一页| 欧洲国内综合视频| 免费在线观看的电影网站| 欧美精品123| 国产精品白丝av| 91精品国产高清一区二区三密臀| 日韩在线视频观看| 极品国产人妖chinesets亚洲人妖| 欧美一级黄色片视频| 亚洲日本一区二区| 欧美香蕉爽爽人人爽| 亚洲jizzjizz日本少妇| 久久精品亚洲一区二区| 免费一级片在线观看| 亚洲无限av看| 精品丝袜久久| 波多野结衣网页| 在线视频亚洲一区| 麻豆mv在线观看| 日韩欧美一级在线|