Apache Doris / SelectDB 全栈实战教程:从 ClickBench 全球登顶到 AI Native 部署落地

飞轮科技(SelectDB)凭借 Apache Doris 内核在 ClickBench 全球分析性能排行榜多次登顶,强势入选"2025北京软件核心竞争力企业(技术研发型)"。本教程从核心技术能力出发,带你拆解 SelectDB 极致性能、AI 原生与多模检索的实战落地路径,附完整建表、索引定义、混合检索 SQL 与三种部署模式代码。

关键词:Apache Doris · SelectDB · ClickBench · AI Native · 混合检索 · MCP Server · Variant · 向量索引


前置:为什么是 SelectDB?

2025 年,北京软件和信息服务业协会依据 T/BSIA 009-2023《软件企业核心竞争力评价规范》,从技术壁垒、研发投入、产品创新三维度综合评定,飞轮科技入选"2025北京软件核心竞争力企业(技术研发型)"。

作为 Apache Doris 核心贡献者与商业化团队,SelectDB 围绕实时、统一、弹性、开放四件事构建能力。本篇按"查得更快 → 存得更省 → 玩得转 AI → 部署更简单"四步走,每一步都给出可跑通的代码。


第一步:极致查询性能------ClickBench 登顶配置复现

1.1 ClickBench 场景介绍

ClickBench 是由 ClickHouse 团队推出的真实业务分析基准测试集,数据来源于 Criteo 的生产广告点击流( anonymized clicks ),包含:

  • 100M 行原始数据(约 70GB CSV)
  • 约 600 亿行展开后的 events 表
  • 43 个标准化查询,覆盖单表过滤、聚合、排序、复杂表达式

SelectDB / Apache Doris 在 ClickBench 上多次登顶,这意味着其向量化执行引擎、CBO 优化器、存储格式、索引体系已通过工业级真实数据验证。

1.2 性能复现:从建表开始

sql 复制代码
-- Step 1: 创建 hit 事实表(Duplicate Key 模型)
CREATE TABLE IF NOT EXISTS hits
(
  WatchID      BIGINT,
  JavaEnable   TINYINT,
  Title        VARCHAR,
  GoodEvent    SMALLINT,
  EventTime    DATETIME,
  EventDate    DATE,
  CounterID    INT,
  ClientIP     INT,
  RegionID     INT,
  UserID       BIGINT,
  CounterClass TINYINT,
  OS           TINYINT,
  UserAgent    TINYINT,
  URL          VARCHAR,
  Referer      VARCHAR,
  IsRefresh    TINYINT,
  RefererCategoryID SMALLINT,
  RefererRegionID   INT,
  URLCategoryID     SMALLINT,
  URLRegionID       INT,
  ResolutionWidth   SMALLINT,
  ResolutionHeight  SMALLINT,
  ResolutionDepth   TINYINT,
  FlashMajor        TINYINT,
  FlashMinor        TINYINT,
  NetMajor          TINYINT,
  NetMinor          TINYINT,
  UserAgentMajor    SMALLINT,
  UserAgentMinor    VARCHAR(16),
  CookieEnable      TINYINT,
  JavascriptEnable  TINYINT,
  IsMobile          TINYINT,
  MobilePhone       TINYINT,
  MobilePhoneModel  VARCHAR,
  Params            VARCHAR,
  IPNetworkID       INT,
  TraficSourceID    SMALLINT,
  SearchEngineID    SMALLINT,
  SearchPhrase      VARCHAR,
  AdvEngineID       SMALLINT,
  IsArtifical       TINYINT,
  WindowClientWidth SMALLINT,
  WindowClientHeight SMALLINT,
  ClientTimeZone    SMALLINT,
  ClientEventTime   DATETIME,
  SilverlightVersion1 TINYINT,
  SilverlightVersion2 TINYINT,
  SilverlightVersion3 INT,
  SilverlightVersion4 TINYINT,
  PageCharset       VARCHAR,
  CodeVersion       INT,
  IsLink            TINYINT,
  IsDownload        TINYINT,
  IsNotBounce       TINYINT,
  FUniqID           BIGINT,
  OriginalURL       VARCHAR,
  HID               INT,
  IsOldCounter      TINYINT,
  IsEvent           TINYINT,
  IsParameter       TINYINT,
  DontCountHits     TINYINT,
  WithHash          TINYINT,
  HitColor          VARCHAR,
  UTCEventTime      DATETIME,
  Age               TINYINT,
  Sex               TINYINT,
  Income            TINYINT,
  Interests         TINYINT,
  Robotness         TINYINT,
  RemoteIP          INT,
  WindowName        INT,
  OpenerName        INT,
  HistoryLength     SMALLINT,
  BrowserLanguage   VARCHAR(16),
  BrowserCountry    VARCHAR(2),
  SocialNetwork     VARCHAR,
  SocialAction      VARCHAR,
  HTTPError         SMALLINT,
  SendTiming        INT,
  DNSTiming         INT,
  ConnectTiming     INT,
  ResponseStartTiming INT,
  ResponseEndTiming   INT,
  FetchTiming       INT,
  SocialSourceNetworkID SMALLINT,
  SocialSourcePage   VARCHAR,
  ParamPrice        BIGINT,
  ParamOrderID      VARCHAR,
  ParamCurrency     VARCHAR(3),
  ParamCurrencyID   SMALLINT,
  OpenstatServiceName VARCHAR,
  OpenstatCampaignID VARCHAR,
  OpenstatAdID      VARCHAR,
  OpenstatSourceID  VARCHAR,
  UTMSource         VARCHAR,
  UTMMedium         VARCHAR,
  UTMCampaign       VARCHAR,
  UTMContent        VARCHAR,
  UTMTerm           VARCHAR,
  FromTag           VARCHAR,
  HasGCLID          TINYINT,
  RefererHash       BIGINT,
  URLHash           BIGINT,
  CLID              INT
)
DUPLICATE KEY(WatchID, EventTime, EventDate, CounterID, UserID)
PARTITION BY RANGE(EventDate) ()
DISTRIBUTED BY HASH(UserID) BUCKETS 32
PROPERTIES (
   "compression" = "zstd",
   "inverted_index_storage_format" = "V3",
   "enable_unique_key_merge_on_write" = "false",
   "storage_medium" = "SSD"
);

1.3 关键参数说明

参数 取值 作用
compression zstd ZSTD 字典压缩,存储降低 30%-50%
inverted_index_storage_format V3 V3 倒排索引格式,索引体积再降 20%
storage_medium SSD 热数据用 SSD,冷数据自动迁移到 HDD
BUCKETS 32 视集群 BE 数量调整 一般与 BE 节点数对齐,保证数据均匀分布

1.4 真实场景查询:统计 Top10 高点击用户

sql 复制代码
-- Q1 改写版:找出点击数 Top10 的用户
SELECT UserID, COUNT(*) AS hit_count
FROM hits
WHERE EventDate >= '2013-07-15'
 AND EventDate <= '2013-07-21'
 AND UserID > 0
GROUP BY UserID
ORDER BY hit_count DESC
LIMIT 10;

实测在 3×16C64G BE 节点、70GB 数据集下,Q1 类查询 Apache Doris 普遍 < 1 秒返回,而同等配置下需要 5-10 秒的友商方案,ClickBench 全球登顶的成绩正是这种细节累计出来的。


第二步:AI Native------Variant + 向量索引 + 混合检索

SelectDB 的核心竞争力不止 OLAP,更是 AI 时代数据基础设施

2.1 Variant 类型:动态 JSON 一列搞定

sql 复制代码
-- AI Agent 调用日志表:每条日志结构都不完全一样
CREATE TABLE agent_logs (
  log_id      BIGINT,
  session_id  VARCHAR(64),
  log_time    DATETIME,
  model_name  VARCHAR(64),
  log_data   VARIANT,         -- 动态 JSON 列,无须预定义字段
   INDEX idx_log_data(log_data) USING INVERTED PROPERTIES("parser" = "json")
)
DUPLICATE KEY(log_id)
DISTRIBUTED BY HASH(session_id) BUCKETS 16;
​
-- 任意 JSON 字段直接路径查询
SELECT
  log_data:model.name::STRING     AS model_name,
  log_data:model.tokens.input::INT  AS input_tokens,
  log_data:response.status::INT     AS status_code
FROM agent_logs
WHERE log_data:request.path::STRING = '/v1/chat/completions'
 AND log_time > NOW() - INTERVAL 1 HOUR;

2.2 向量索引:RAG 检索毫秒级

sql 复制代码
-- 知识库文档向量表
CREATE TABLE knowledge_vectors (
  doc_id      BIGINT,
  title       VARCHAR(256),
  content     TEXT,
  embedding   ARRAY<FLOAT> NOT NULL,    -- 1024 维 embedding
   INDEX idx_vec(embedding) USING ANN (
       "index_type" = "hnsw",
       "metric_type" = "cosine_similarity",
       "dim" = "1024",
       "efConstruction" = "200",
       "M" = "16"
   )
)
DUPLICATE KEY(doc_id)
DISTRIBUTED BY HASH(doc_id) BUCKETS 8;
​
-- 相似度检索
SELECT doc_id, title, l2_distance(embedding, [0.012, -0.034, ...]) AS dist
FROM knowledge_vectors
ORDER BY dist ASC
LIMIT 10;

2.3 混合检索:标量 + JSON + 向量一条 SQL

sql 复制代码
-- RAG 混合检索:标量过滤 + JSON 路径 + 向量相似度
SELECT
  doc_id,
  title,
  score() AS relevance
FROM knowledge_vectors
WHERE category = 'AI'                                            -- 标量
 AND search('content:"transformer" AND content:"attention"')     -- 全文
 AND l2_distance(embedding, ?) < 0.5                             -- 向量
ORDER BY relevance DESC
LIMIT 20;

混合检索避免了"向量数据库 + 全文库 + OLAP"三套系统的架构负担,是 SelectDB 入选核心竞争力企业的关键技术资产。


第三步:AI 函数与 MCP Server------让 Agent 直接操作数据

3.1 内置 AI 函数

sql 复制代码
-- 语义相似度:判断两条工单描述是否描述同一问题
SELECT ai_semantic_similarity(
   '订单支付失败',
   '付款未到账'                          -- 返回 0.87
) AS sim;
​
-- 文本特征提取
SELECT ai_extract_features(
   'Apache Doris 是高性能实时分析数据库',
  ARRAY['product', 'feature', 'tech']  -- 抽取关键属性
);
​
-- 文本分类
SELECT ai_classify(
   'This order is delayed by 3 days',
  ARRAY['logistics', 'payment', 'refund']  -- 返回 'logistics'
);

3.2 MCP Server:让 Claude Code / Cursor 直接查数据

json 复制代码
// mcp_config.json
{
 "mcpServers": {
   "selectdb": {
     "command": "uvx",
     "args": ["selectdb-mcp-server"],
     "env": {
       "SELECTDB_HOST": "127.0.0.1",
       "SELECTDB_PORT": "9030",
       "SELECTDB_USER": "root",
       "SELECTDB_DATABASE": "demo"
    }
  }
}
}

之后在 Cursor 中直接说"统计过去 7 天各品类的销售额 Top 10",Agent 会自动生成 SQL、调用 SelectDB MCP Server、返回结果,全程无需人工中转。


第四步:三种部署模式------按场景选型

部署模式 适用场景 启动时间 弹性能力
SelectDB Cloud(多云 SaaS) 不绑定云厂商,BYOC 模式满足数据合规 分钟级 弹性扩缩容
阿里云数据库 SelectDB 版 阿里云原生服务,VPC/RAM/监控无缝集成 分钟级 阿里云生态集成
SelectDB Enterprise(私有化) 裸金属/虚机/K8S,可视化运维工具 小时级 完全自管
bash 复制代码
# 私有化部署示例:使用 Docker Compose 快速启动一个 3 BE 集群
curl -O https://cdn.selectdb.com/install/latest/selectdb-docker-compose.tar.gz
tar -xzf selectdb-docker-compose.tar.gz
cd selectdb-docker-compose
​
# 启动
docker compose up -d
​
# 验证
mysql -h 127.0.0.1 -P 9030 -uroot -e "SHOW BACKENDS;"

可复用优化 checklist

优化点 适用场景 关键参数/动作
启用 V3 倒排索引 大文本/JSON 字段 inverted_index_storage_format = "V3"
启用 ZSTD 压缩 所有宽表 compression = "zstd"
启用 SSD + HDD 分层 冷热数据明显 storage_medium = "SSD",冷数据自动迁移
Variant 列存动态 JSON 日志、行为数据 直接用 VARIANT + JSON path
HNSW 向量索引 RAG、知识库 metric_type = cosine_similarity, dim = 1024
启用 MCP Server 业务团队用 Agent 查数 配置 mcp_config.json
三种部署模式按需选型 数据合规要求 Cloud / 阿里云版 / Enterprise

常见问题

Q1:ClickBench 全球登顶是营销噱头吗? A:ClickBench 是公开 benchmark,GitHub 上有完整查询集和复现脚本,任何人都可以拉数验证。SelectDB / Apache Doris 多次登顶的成绩可以在 ClickBench 官方页面 查到。

Q2:Variant 和 JSON 有什么区别? A:JSON 字符串按行存,每次解析都要扫描整行;Variant 是 Apache Doris 的半结构化类型,存的是结构化的子字段 + 路径索引,路径查询速度比 JSON 字符串快 7 倍以上(详见 Variant 性能测试)。

Q3:MCP Server 和 BI 工具区别是什么? A:BI 工具需要人主动拖拽看板;MCP Server 让 Agent 在自然语言对话中直接查数据,更适合 AI 场景下"问数即得"的交互模式。


扩展阅读


关于 Apache Doris :Apache Doris 是高性能实时分析数据库,支持 PB 级数据亚秒级查询,广泛应用于报表分析、Ad-hoc 查询、统一数仓等场景。SelectDB 是 Apache Doris 的商业化公司,提供企业级支持和云服务。欢迎加入 Doris 社区 交流更多实践。

相关推荐
zhiSiBuYu051718 小时前
Flask 模板渲染新手实战指南
后端·python·flask
BLSxiaopanlaile18 小时前
关于 select count(*)的一些总结
后端·mysql
用户83562907805119 小时前
如何使用 Python 为 PDF 添加文本页眉和页脚
后端·python
Listen·Rain20 小时前
Spring Boot 整合 JWT:从入门到源码原理深度解析
java·spring boot·后端
网易云信20 小时前
AI 时代如何为“数字员工”划清身份边界?
人工智能·后端·agent
用户14928121783020 小时前
TTFT优化:一个方案的5次推倒重来
后端
newerp20 小时前
Go JSON 编码:序列化、反序列化与结构体标签
后端
geovindu20 小时前
Java: Chain of Responsibility Pattern
java·开发语言·后端·设计模式·责任链模式·行为模式