飞轮科技(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 社区 交流更多实践。