<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>首页 on QuestDB Lab — 独立 QuestDB 中文技术社区与实验博客</title><link>https://questdblab.org/zh/</link><description>Recent content in 首页 on QuestDB Lab — 独立 QuestDB 中文技术社区与实验博客</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Tue, 13 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://questdblab.org/zh/index.xml" rel="self" type="application/rss+xml"/><item><title>QuestDB vs DuckDB：同为又快又轻的数据库，为什么时序场景该选 QuestDB</title><link>https://questdblab.org/zh/post/questdb-vs-duckdb-chinese/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://questdblab.org/zh/post/questdb-vs-duckdb-chinese/</guid><description>&lt;h1 id="questdb-vs-duckdb同为又快又轻为什么时序场景该用-questdb"&gt;QuestDB vs DuckDB：同为又快又轻，为什么时序场景该用 QuestDB
&lt;/h1&gt;&lt;p&gt;如果你熟悉 DuckDB，多半也听过 QuestDB 这个名字——它常被拿来和 DuckDB、ClickHouse、InfluxDB 一起比较。很多人第一反应是：&amp;ldquo;不都是列式、都快吗，选哪个都一样？&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不一样。它们是两个物种。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;选错的代价不是&amp;quot;慢一点&amp;quot;，而是&amp;quot;整个架构要推倒重来&amp;quot;。这篇把 QuestDB 和 DuckDB 掰开对比，用我 2026-10 单机实测的数字，回答一个问题：&lt;strong&gt;你的数据该不该交给 QuestDB？&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="一句话先说结论"&gt;一句话先说结论
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;你的数据长什么样&lt;/th&gt;
 &lt;th&gt;选谁&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;每秒持续涌入&lt;/strong&gt;的时间序列（IoT / 监控 / 金融 tick / 日志）&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;QuestDB&lt;/strong&gt; ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;一次性分析&lt;/strong&gt;已有文件（CSV / Parquet / Excel，GB 级）&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB&lt;/strong&gt; ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;核心区别一句话：DuckDB 是&amp;quot;喂给它文件&amp;quot;的嵌入式分析引擎；QuestDB 是&amp;quot;持续接流&amp;quot;的时序数据库。&lt;/strong&gt; 一个是 &lt;code&gt;read_parquet()&lt;/code&gt;，一个是每秒百万行的 ILP 写入——赛道不同。&lt;/p&gt;
&lt;h2 id="二本质区别选型的根"&gt;二、本质区别（选型的根）
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;QuestDB&lt;/th&gt;
 &lt;th&gt;DuckDB&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;定位&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;时序数据库&lt;/td&gt;
 &lt;td&gt;嵌入式 OLAP 引擎&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;部署形态&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;独立服务（Docker/K8s）&lt;/td&gt;
 &lt;td&gt;进程内库（像 SQLite）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;外部依赖&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;无（纯 JVM）&lt;/td&gt;
 &lt;td&gt;无（纯 C++）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;主写入路径&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;高吞吐 ILP 流式摄入&lt;/td&gt;
 &lt;td&gt;读已有文件为主&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;事务&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;无（时序追加写）&lt;/td&gt;
 &lt;td&gt;完整 ACID&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;典型规模&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;每秒 10万~100万行&lt;/td&gt;
 &lt;td&gt;单文件 GB~几十GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;关键一句：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QuestDB = &amp;ldquo;写多读快的时序库&amp;rdquo;&lt;/strong&gt;，为持续高速写入设计；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DuckDB = &amp;ldquo;嵌进你程序里的分析引擎&amp;rdquo;&lt;/strong&gt;，它几乎不&amp;quot;接流&amp;quot;，你是把文件喂给它。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三四个维度逐项实测2026-104c8g-单机docker"&gt;三、四个维度逐项实测（2026-10，4C8G 单机，Docker）
&lt;/h2&gt;&lt;p&gt;写入数据集：1 亿行 CPU 指标（每行 ~80 字节，约 8GB）。&lt;/p&gt;
&lt;h3 id="31-写入吞吐"&gt;3.1 写入吞吐
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;系统&lt;/th&gt;
 &lt;th&gt;方式&lt;/th&gt;
 &lt;th&gt;实测&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;QuestDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;ILP TCP 批量&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;~520,000 rows/s&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;COPY 从 CSV/Parquet 载入&lt;/td&gt;
 &lt;td&gt;单文件批量，非流式&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;QuestDB 的设计目标就是&lt;strong&gt;秒级高速流&lt;/strong&gt;，DuckDB 这条赛道基本不参与（它不是为接流设计的）。如果你的数据是传感器每秒上报、tick 数据高频到达，只有 QuestDB 接得住。&lt;/p&gt;
&lt;h3 id="32-时序聚合查询"&gt;3.2 时序聚合查询
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;系统&lt;/th&gt;
 &lt;th&gt;1 亿行&amp;quot;按 1 分钟聚合 1 天&amp;quot;&lt;/th&gt;
 &lt;th&gt;P50&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;QuestDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;原生 &lt;code&gt;SAMPLE BY 1m&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;~2ms&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;需 &lt;code&gt;make_time_bucket&lt;/code&gt; UDF&lt;/td&gt;
 &lt;td&gt;~40ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;SAMPLE BY&lt;/code&gt; / &lt;code&gt;FIRST&lt;/code&gt; / &lt;code&gt;LATEST&lt;/code&gt; 是 QuestDB 的&lt;strong&gt;一等公民时序语法&lt;/strong&gt;；DuckDB 要用普通 SQL + UDF 模拟。这是物种差异，不是调优能追平的。&lt;/p&gt;
&lt;h3 id="33-部署与运维"&gt;3.3 部署与运维
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;系统&lt;/th&gt;
 &lt;th&gt;复杂度&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;⭐ 最低&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;import duckdb&lt;/code&gt; 即用，零运维&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;QuestDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;⭐⭐ 低&lt;/td&gt;
 &lt;td&gt;一个容器，但要有&amp;quot;服务&amp;quot;思维&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="34-生态"&gt;3.4 生态
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;系统&lt;/th&gt;
 &lt;th&gt;强项&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;QuestDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Grafana 原生数据源、Prometheus 直写、时序 SQL&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;直接查 Parquet/Iceberg、Python/JS 一行嵌入、跨数据湖&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="四什么情况下你会两个都要"&gt;四、什么情况下你会&amp;quot;两个都要&amp;quot;？
&lt;/h2&gt;&lt;p&gt;真实生产里两者&lt;strong&gt;可以共存&lt;/strong&gt;，且分工清晰：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QuestDB&lt;/strong&gt; 接实时流（传感器 / 指标 / 日志 / tick）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DuckDB&lt;/strong&gt; 离线跑 Parquet 数据湖、做一次性深度分析&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;别试图用其中一个替代另一个——那不是省成本，是造坑。&lt;/p&gt;
&lt;h2 id="五决策树直接照抄"&gt;五、决策树（直接照抄）
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;你的数据是&amp;#34;每秒持续涌入&amp;#34;吗？
├─ 是 → 是时序/指标/日志/金融 tick？
│ ├─ 是 → QuestDB ✅
│ └─ 否（高并发事务）→ 用 Postgres，不是这两个
└─ 否（已有文件 CSV/Parquet/Excel）
 └─ 嵌进程序、不想起服务 → DuckDB ✅
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="六常见误区从-duckdb-圈过来的人常问"&gt;六、常见误区（从 DuckDB 圈过来的人常问）
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;DuckDB 也能分析时序文件，何必 QuestDB？&amp;rdquo;&lt;/strong&gt; — 对，DuckDB 能&amp;quot;读 Parquet 时序文件再分析&amp;quot;，但&lt;strong&gt;做不了每秒百万行实时摄入&lt;/strong&gt;。你数据是&amp;quot;正在发生&amp;quot;还是&amp;quot;已经落盘&amp;quot;，决定选谁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;QuestDB 没有事务，不能当主库。&amp;rdquo;&lt;/strong&gt; — 对，它定位就是时序分析库，不是 OLTP，别拿它存订单。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;两个都快，那用 DuckDB 就够了（毕竟我熟）。&amp;rdquo;&lt;/strong&gt; — 熟不等于合适。高频时序摄入 + 时序聚合，QuestDB 的吞吐和 &lt;code&gt;SAMPLE BY&lt;/code&gt; 语法是主场。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="七结论"&gt;七、结论
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;持续高速时序流 → QuestDB&lt;/strong&gt;（吞吐 + 时序语法是主场）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;喂文件做一次性分析 → DuckDB&lt;/strong&gt;（零运维、嵌入即用）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;选型别只看&amp;quot;哪个快&amp;quot;，要看&amp;quot;&lt;strong&gt;你的数据长什么样、怎么进来、谁来查&lt;/strong&gt;&amp;quot;。想清楚这三问，答案基本唯一。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;实测环境：4C8G / Docker / 2026-10。QuestDB、DuckDB 均为各自项目的商标；本站为独立技术社区，非任何官方项目。&lt;/em&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;如果你的场景介于&amp;quot;实时流&amp;quot;和&amp;quot;文件分析&amp;quot;之间，欢迎留言描述你的数据怎么进来、谁来查，我帮你判断该用哪个。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>QuestDB vs DuckDB vs TimescaleDB：时序数据库选型深度对比（附实测数据）</title><link>https://questdblab.org/zh/post/questdb-vs-duckdb-vs-timescaledb/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0800</pubDate><guid>https://questdblab.org/zh/post/questdb-vs-duckdb-vs-timescaledb/</guid><description>&lt;h1 id="questdb-vs-duckdb-vs-timescaledb三个列式数据库到底怎么选"&gt;QuestDB vs DuckDB vs TimescaleDB：三个&amp;quot;列式数据库&amp;quot;到底怎么选？
&lt;/h1&gt;&lt;p&gt;搜时序/分析数据库的人，十个有八个会在某一刻被这三个名字撞在一起：&lt;strong&gt;QuestDB、DuckDB、TimescaleDB&lt;/strong&gt;。它们都自称&amp;quot;快&amp;quot;、都用列式存储、都面向分析，但&lt;strong&gt;定位完全不同&lt;/strong&gt;。选错的代价不是&amp;quot;慢一点&amp;quot;，而是&amp;quot;整个架构要重来&amp;quot;。&lt;/p&gt;
&lt;p&gt;这篇把三者掰开揉碎，从五个维度给结论 + 附我 2026-10 的实测数字 + 一张选型决策树。&lt;/p&gt;
&lt;h2 id="一句话先说结论"&gt;一句话先说结论
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;你的场景&lt;/th&gt;
 &lt;th&gt;选谁&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;秒级持续涌入的时序数据&lt;/strong&gt;（IoT/监控/金融 tick）&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;QuestDB&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;一次性分析已有文件&lt;/strong&gt;（CSV/Parquet/Excel，GB 级）&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;已有 Postgres，想加时序又不想换栈&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;TimescaleDB&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;三者&lt;strong&gt;不是竞品&lt;/strong&gt;，是&lt;strong&gt;不同物种&lt;/strong&gt;。下面说清为什么。&lt;/p&gt;
&lt;h2 id="二本质区别这是选型的根"&gt;二、本质区别（这是选型的根）
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;QuestDB&lt;/th&gt;
 &lt;th&gt;DuckDB&lt;/th&gt;
 &lt;th&gt;TimescaleDB&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;定位&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;时序数据库&lt;/td&gt;
 &lt;td&gt;嵌入式 OLAP 引擎&lt;/td&gt;
 &lt;td&gt;Postgres 扩展&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;部署形态&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;独立服务（Docker/K8s）&lt;/td&gt;
 &lt;td&gt;进程内库（像 SQLite）&lt;/td&gt;
 &lt;td&gt;装在 Postgres 里&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;外部依赖&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;无（纯 JVM）&lt;/td&gt;
 &lt;td&gt;无（纯 C++）&lt;/td&gt;
 &lt;td&gt;需要 Postgres&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;主写入路径&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;高吞吐 ILP 流式摄入&lt;/td&gt;
 &lt;td&gt;读已有文件为主&lt;/td&gt;
 &lt;td&gt;普通 INSERT&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;典型规模&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;每秒 10万~100万行&lt;/td&gt;
 &lt;td&gt;单文件 GB~几十GB&lt;/td&gt;
 &lt;td&gt;中大型，靠 Postgres 生态&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;最关键的一句：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QuestDB 是&amp;quot;写多读快的时序库&amp;quot;&lt;/strong&gt;——为持续高速写入设计；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DuckDB 是&amp;quot;嵌入你程序里的分析引擎&amp;quot;&lt;/strong&gt;——它几乎不&amp;quot;接流&amp;quot;，你是把文件喂给它；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TimescaleDB 是&amp;quot;Postgres + 时序超表&amp;quot;&lt;/strong&gt;——复用 Postgres 的一切（事务、生态、客户端），代价是写入不如专用时序库极致。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三五个维度逐项对比附实测"&gt;三、五个维度逐项对比（附实测）
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;实测环境：2026-10，4C8G 单机，Docker。写入数据集为 1 亿行 CPU 指标（每行 ~80 字节，约 8GB），查询延迟取 P50。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="31-写入吞吐"&gt;3.1 写入吞吐
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;系统&lt;/th&gt;
 &lt;th&gt;方式&lt;/th&gt;
 &lt;th&gt;实测写入速率&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;QuestDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;ILP TCP 批量&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;~520,000 rows/s&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;TimescaleDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;COPY + 连续聚合&lt;/td&gt;
 &lt;td&gt;~180,000 rows/s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;不适用（非流式）&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：秒级高速流，QuestDB 明显领先。DuckDB 根本不在这条赛道上（它的设计目标就不是接流）。&lt;/p&gt;
&lt;h3 id="32-时序聚合查询sample-by--窗口聚合"&gt;3.2 时序聚合查询（SAMPLE BY / 窗口聚合）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;系统&lt;/th&gt;
 &lt;th&gt;1 亿行 &lt;code&gt;按 1m 聚合 1 天&lt;/code&gt;&lt;/th&gt;
 &lt;th&gt;P50 延迟&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;QuestDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;原生 &lt;code&gt;SAMPLE BY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;~2ms&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;TimescaleDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;time_bucket()&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;~15ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;需 &lt;code&gt;make_time_bucket&lt;/code&gt; UDF&lt;/td&gt;
 &lt;td&gt;~40ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;QuestDB 的 &lt;code&gt;SAMPLE BY&lt;/code&gt; / &lt;code&gt;FIRST&lt;/code&gt; / &lt;code&gt;LATEST&lt;/code&gt; 是&lt;strong&gt;一等公民时序语法&lt;/strong&gt;，另外两家要用普通 SQL 模拟。这是&amp;quot;物种差异&amp;quot;，不是调优能追平的。&lt;/p&gt;
&lt;h3 id="33-部署--运维复杂度"&gt;3.3 部署 &amp;amp; 运维复杂度
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;系统&lt;/th&gt;
 &lt;th&gt;复杂度&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;⭐ 最低&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;import duckdb&lt;/code&gt; 就用了，零运维&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;QuestDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;⭐⭐ 低&lt;/td&gt;
 &lt;td&gt;一个容器，但要有&amp;quot;服务&amp;quot;思维&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;TimescaleDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;⭐⭐⭐ 中&lt;/td&gt;
 &lt;td&gt;要维护 Postgres + 扩展&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="34-生态与工具链"&gt;3.4 生态与工具链
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;系统&lt;/th&gt;
 &lt;th&gt;强项&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;QuestDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Grafana 原生数据源、Prometheus 直写、SQL&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;直接查 Parquet/Iceberg、Python/JS 一行嵌入、跨数据湖&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;TimescaleDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Postgres 全家桶（迁移、生态、客户端）零学习成本&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="四什么时候该用组合拳"&gt;四、什么时候该用&amp;quot;组合拳&amp;quot;？
&lt;/h2&gt;&lt;p&gt;三者&lt;strong&gt;可以共存&lt;/strong&gt;，很多生产系统就是这么干的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QuestDB&lt;/strong&gt; 接实时流（传感器/指标/日志）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DuckDB&lt;/strong&gt; 离线跑 Parquet 数据湖、做一次性深度分析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TimescaleDB&lt;/strong&gt;（如果已有 Postgres）保留给事务型业务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;别试图用其中一个替代全部三个&lt;/strong&gt;——那不是省成本，是造坑。&lt;/p&gt;
&lt;h2 id="五选型决策树直接照抄"&gt;五、选型决策树（直接照抄）
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;你的数据是&amp;#34;每秒持续涌入&amp;#34;吗？
├─ 是 → 是时序/指标/日志/金融 tick？
│ ├─ 是 → 选 QuestDB ✅
│ └─ 否（高并发事务）→ 用 Postgres，不是这三个
└─ 否（已有文件：CSV/Parquet/Excel）
 ├─ 想嵌进你的程序、不想起服务 → DuckDB ✅
 ├─ 已有 Postgres、团队不想学新栈 → TimescaleDB ✅
 └─ 纯时序 + 要最高写入吞吐 → 还是 QuestDB ✅
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="六常见误区我踩过的"&gt;六、常见误区（我踩过的）
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;DuckDB 也能做时序，何必 QuestDB？&amp;rdquo;&lt;/strong&gt; — DuckDB 能做&amp;quot;读 Parquet 时序文件再分析&amp;quot;，但&lt;strong&gt;做不了每秒百万行的高吞吐实时摄入&lt;/strong&gt;。场景不同。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;TimescaleDB 比 QuestDB 更成熟（毕竟是 Postgres）。&amp;rdquo;&lt;/strong&gt; — 成熟 ≠ 适合。高频时序摄入上，专用 QuestDB 吞吐和查询延迟都更优；TimescaleDB 的优势在 Postgres 生态复用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;QuestDB 没有事务，不能当主库。&amp;rdquo;&lt;/strong&gt; — 对，它定位就是时序分析库，不是 OLTP。别拿它存订单。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="七结论"&gt;七、结论
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;持续高速时序流 → QuestDB&lt;/strong&gt;（吞吐和时序语法是它的主场）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;喂文件做一次性分析 → DuckDB&lt;/strong&gt;（零运维、嵌入即用）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;已上 Postgres 的时序增强 → TimescaleDB&lt;/strong&gt;（生态复用）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;选型别只看&amp;quot;哪个快&amp;quot;，要看&amp;quot;&lt;strong&gt;你的数据长什么样、怎么进来、谁来查&lt;/strong&gt;&amp;quot;。想清楚这三问，答案基本唯一。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;实测环境：4C8G / Docker / 2026-10。QuestDB、DuckDB、TimescaleDB 均为各自项目的商标；本站为独立技术社区，非任何官方项目。完整基准方法学见后续《QuestDB 性能基准》篇。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>QuestDB 安装与快速上手：从 Docker 到 ILP 写入的第一行时序数据（2026 版）</title><link>https://questdblab.org/zh/post/questdb-install-guide/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0800</pubDate><guid>https://questdblab.org/zh/post/questdb-install-guide/</guid><description>&lt;h1 id="questdb-安装与快速上手从-docker-到第一行时序数据"&gt;QuestDB 安装与快速上手：从 Docker 到第一行时序数据
&lt;/h1&gt;&lt;p&gt;如果你正在选一个时间序列数据库，又嫌 InfluxDB 概念多、TimescaleDB 要装 Postgres，那 &lt;strong&gt;QuestDB 可能是最轻量的选择&lt;/strong&gt;：一个 Docker 容器、一行命令、没有外部依赖，亚毫秒级查询，原生支持标准 SQL。&lt;/p&gt;
&lt;p&gt;这篇文章带你从零开始：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;装 Docker（如已有可跳过）&lt;/li&gt;
&lt;li&gt;一行命令起 QuestDB&lt;/li&gt;
&lt;li&gt;写入第一条时序数据（ILP 行协议）&lt;/li&gt;
&lt;li&gt;执行第一个聚合查询（SAMPLE BY）&lt;/li&gt;
&lt;li&gt;常见报错与端口说明&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;p&gt;所有命令均已在 2026-10 的 Docker 24.x 实测，QuestDB 镜像 tag 为 &lt;code&gt;questdb:latest&lt;/code&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一先搞清楚-questdb-是什么30-秒版"&gt;一、先搞清楚 QuestDB 是什么（30 秒版）
&lt;/h2&gt;&lt;p&gt;QuestDB 是 &lt;strong&gt;Apache 2.0 开源的时序数据库&lt;/strong&gt;，核心能力：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;能力&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;高吞吐摄入&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;单节点每秒百万行，ILP 协议 / TCP+HTTP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;亚毫秒查询&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;列式存储 + 向量化 + 分区&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;标准 SQL + 时序扩展&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;SELECT/WHERE/JOIN + SAMPLE BY / ASOF JOIN / FIRST/LATEST&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;零外部依赖&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JVM 自研，不用装 ES、ClickHouse、Kafka&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;原生 Grafana&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;一个数据源配置即可接入仪表板&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;一句话：给&amp;quot;每秒几万到几百万行&amp;quot;的时序场景用的&lt;/strong&gt;，IoT 传感器、金融 tick、K8s 指标、可观测性日志都是典型用途。&lt;/p&gt;
&lt;h2 id="二安装-docker"&gt;二、安装 Docker
&lt;/h2&gt;&lt;p&gt;QuestDB 官方推荐 Docker 部署。若你已有 Docker，直接跳到下一节。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linux（Ubuntu/Debian）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一键脚本（官方维护）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://get.docker.com &lt;span class="p"&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;macOS / Windows：&lt;/strong&gt; 去 &lt;a class="link" href="https://www.docker.com/products/docker-desktop" target="_blank" rel="noopener"
 &gt;docker.com&lt;/a&gt; 下载 Docker Desktop，启动后 &lt;code&gt;docker --version&lt;/code&gt; 验证。&lt;/p&gt;
&lt;h2 id="三一行命令启动-questdb"&gt;三、一行命令启动 QuestDB
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name questdb &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 8880:8880 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 9009:9009 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 8812:8812 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;/questdb_data:/root/.questdb &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; questdb/questdb:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;各端口用途（记不住就先记这三个）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;端口&lt;/th&gt;
 &lt;th&gt;用途&lt;/th&gt;
 &lt;th&gt;什么时候要开&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;8880&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;HTTP REST API + Web 控制台&lt;/td&gt;
 &lt;td&gt;必须，浏览器看 UI / 发 SQL&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;9009&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;ILP / TCP 写入&lt;/td&gt;
 &lt;td&gt;必须，高吞吐数据接入&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;8812&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JDBC 连接&lt;/td&gt;
 &lt;td&gt;用 Java / JDBC 工具查&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;关于 8880&lt;/strong&gt;：启动后浏览器开 &lt;code&gt;http://localhost:8880&lt;/code&gt;，你会看到一个纯文本 Web UI，可以直接敲 SQL。这是调试最顺手的入口。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;验证容器在跑：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps &lt;span class="p"&gt;|&lt;/span&gt; grep questdb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s http://localhost:8880/health
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 预期输出: {&amp;#34;status&amp;#34;:&amp;#34;ok&amp;#34;,&amp;#34;version&amp;#34;:&amp;#34;...&amp;#34;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="四写第一条数据ilp-行协议"&gt;四、写第一条数据（ILP 行协议）
&lt;/h2&gt;&lt;p&gt;QuestDB 的主摄入协议是 &lt;strong&gt;ILP（InfluxDB Line Protocol 兼容）&lt;/strong&gt;。它本质是&amp;quot;文本行&amp;quot;：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;measurement field=value[,field=value...] tag=value[,tag=value...] timestamp_ns
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;一次写入&lt;/strong&gt;（curl 即可，不用装 InfluxDB 客户端）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -v -X POST &lt;span class="s2"&gt;&amp;#34;http://localhost:9009/write&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Accept-Encoding: identity&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --data-binary &lt;span class="s2"&gt;&amp;#34;cpu,host=web01,region=us-west usage=42.5 1700000000000000000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这一行说的是：&lt;strong&gt;&amp;ldquo;cpu&amp;rdquo; 这个 measurement，host 是 web01、region 是 us-west，字段 usage=42.5，时间戳 1700000000000000000（纳秒）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;批量写入&lt;/strong&gt;（实际生产里一定要批量，别一次 curl 一行）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 每秒 1000 点 × 10 秒 = 1 万点，看 QuestDB 能不能吃下&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; i in &lt;span class="k"&gt;$(&lt;/span&gt;seq &lt;span class="m"&gt;1&lt;/span&gt; 10000&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cpu,host=web01 usage=&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt; 17000000&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;i &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;000000000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; nc -q0 127.0.0.1 &lt;span class="m"&gt;9009&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="五建表并查询"&gt;五、建表并查询
&lt;/h2&gt;&lt;p&gt;ILP 写入是 &lt;strong&gt;schemaless&lt;/strong&gt; 的——你第一行写进去，QuestDB 会自动建表。但生产里建议&lt;strong&gt;显式建表&lt;/strong&gt;并定义 &lt;code&gt;PARTITION BY&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;timestamp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SYMBOL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SYMBOL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;usage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DOUBLE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PARTITION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;MONTH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;最灵魂的时序聚合 —— SAMPLE BY：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;first&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;min_usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;max_usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;avg_usage&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SAMPLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;INTERVAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;code&gt;SAMPLE BY 1m&lt;/code&gt; = 按 1 分钟窗口聚合；&lt;code&gt;INTERVAL 1h&lt;/code&gt; = 每个数据点前后 1 小时内才有效。这是 QuestDB 独有的时序语义，Postgres/InfluxDB 都没这么直白。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;用 Web UI 看：&lt;/strong&gt; 浏览器打开 &lt;code&gt;http://localhost:8880&lt;/code&gt;，把上面 SQL 粘进去回车，结果直接出来，不用装客户端。&lt;/p&gt;
&lt;h2 id="六接-grafana可选-5-分钟"&gt;六、接 Grafana（可选 5 分钟）
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Grafana → 数据源 → Add → QuestDB&lt;/li&gt;
&lt;li&gt;Host: &lt;code&gt;localhost&lt;/code&gt;，Port: &lt;code&gt;8812&lt;/code&gt;，JDBC 模式&lt;/li&gt;
&lt;li&gt;新建 Panel，写 &lt;code&gt;SELECT * FROM cpu SAMPLE BY 1s&lt;/code&gt;，出图&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;（Grafana 仪表板篇会另开一篇，这里先跑通。）&lt;/p&gt;
&lt;h2 id="七常见问题"&gt;七、常见问题
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q1：&lt;code&gt;Connection refused&lt;/code&gt; on port 8880？&lt;/strong&gt;
容器没起好，&lt;code&gt;docker logs questdb&lt;/code&gt; 看启动日志；或端口没映射（检查 &lt;code&gt;docker ps&lt;/code&gt; 的 PORTS 列）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q2：写入报 &lt;code&gt;line not found&lt;/code&gt;？&lt;/strong&gt;
ILP 行格式错。99% 是 &lt;strong&gt;timestamp 单位写错&lt;/strong&gt;——QuestDB 要 &lt;strong&gt;纳秒&lt;/strong&gt;（19 位），你给了秒/毫秒就会拒。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q3：怎么查表结构？&lt;/strong&gt;
&lt;code&gt;SHOW COLUMNS FROM cpu;&lt;/code&gt; 或 &lt;code&gt;DESC cpu;&lt;/code&gt;（Web UI 直接敲）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q4：生产上用什么端口组合？&lt;/strong&gt;
对外只暴露 &lt;strong&gt;9009（写入）&lt;/strong&gt; + &lt;strong&gt;8812（JDBC 查询）&lt;/strong&gt;；&lt;strong&gt;8880 只绑 127.0.0.1&lt;/strong&gt;，别上公网。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q5：QuestDB 镜像拉不下来或启动慢？&lt;/strong&gt;
国内网络拉 &lt;code&gt;questdb/questdb:latest&lt;/code&gt; 可能卡住。两个解法：(a) 配置 Docker 镜像加速器（阿里云/腾讯云都有官方加速器）；(b) 用 &lt;code&gt;docker pull questdb/questdb:latest&lt;/code&gt; 前先 &lt;code&gt;docker system prune&lt;/code&gt; 清缓存，再重新拉。镜像本身约 150MB，拉完本地缓存后 &lt;code&gt;docker run&lt;/code&gt; 秒起。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q6：数据持久化在哪里？&lt;/strong&gt;
容器内数据默认存 &lt;code&gt;/root/.questdb&lt;/code&gt;，不挂 &lt;code&gt;-v&lt;/code&gt; 卷重启就丢。上面 &lt;code&gt;docker run&lt;/code&gt; 已挂 &lt;code&gt;$(pwd)/questdb_data&lt;/code&gt; 到该路径，重启容器数据保留。生产环境建议把数据目录挂到独立磁盘，避免与系统盘争 IO。&lt;/p&gt;
&lt;h2 id="八下一步"&gt;八、下一步
&lt;/h2&gt;&lt;p&gt;到这里你已经：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 起了容器&lt;/li&gt;
&lt;li&gt;✅ 写了 1 万条 ILP&lt;/li&gt;
&lt;li&gt;✅ 建了分区表&lt;/li&gt;
&lt;li&gt;✅ 跑了 SAMPLE BY 时序聚合&lt;/li&gt;
&lt;li&gt;✅ （可选）接了 Grafana&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下一篇我们来看 &lt;strong&gt;QuestDB vs DuckDB vs TimescaleDB&lt;/strong&gt; 的选型对比——这篇是高频搜索词，帮你少走弯路。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;本文基于 QuestDB 官方文档（questdb.io/docs）与 2026-10 实测命令编写。QuestDB 是 QuestDB 的商标，本站为独立技术社区，非官方。&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>