一套自包含的演示数据 + SQL,在一个「带智能检索的电商 + 知识库」场景下,分别展示 MatrixOne 的 事务 / 分析 / Git for Data / 向量+全文 / 混合查询 / Stage 非结构化管理 六大能力。
- 适用版本:MatrixOne
v3.0.11+(MatrixOne Cloud 或自建均可)。 - 所有脚本均已在 MatrixOne Cloud
8.0.30-MatrixOne-v3.0.11上实际跑通。 - 连接信息用环境变量提供(见「快速开始」),文中示例以
<host>/<account>/<password>占位。
mo_demo/
├── run_all.sh # 一键运行(或按编号单跑)
├── README.md # 本文件
└── sql/
├── 00_setup.sql # 建库 + 造数(共享维度 + 3000 行销售流水)
├── 01_transaction.sql # 能力一:事务 ACID
├── 02_analytics.sql # 能力二:OLAP 分析
├── 03_git4data.sql # 能力三:数据版本管理
├── 04_vector_fulltext.sql # 能力四:向量检索 + 全文检索
├── 05_hybrid.sql # 能力五:混合查询
├── 06_stage.sql # 能力六:Stage + 非结构化数据
├── 07_scheduled_task.sql # 能力七:任务调度(原生 SQL Task)
├── 99_cleanup.sql # 清理全部演示对象
├── tpch_sf10_queries.sql # 附:TPC-H 22 条查询(库 mo_sample_data_tpch_sf10)
├── git4data_workbook.sql # 独立可跑的 Git-for-Data 完整示例
└── mo_workbook.sql # ⭐ 七大能力合一的单文件 Workbook(OmniFabric v4.0 / MatrixOne v3.0.11 通用)
# 1) 设置连接信息(自建实例示例;MatrixOne Cloud 把 MO_USER 换成 '<account>:admin:accountadmin')
export MO_HOST=127.0.0.1 MO_PORT=6001 MO_USER=root MO_PASS=111
# 2) 运行
bash run_all.sh # 按 00→07 顺序全部执行
bash run_all.sh 04 # 只跑某一个能力单独执行某个脚本时建议带
--force(部分演示故意触发约束/索引异常以展示行为):mysql -h <host> -P 6001 -u '<account>:admin:accountadmin' -p'<password>' --force mo_demo < sql/04_vector_fulltext.sql注意:必须先跑
00_setup.sql,后续脚本都依赖它建的库和数据。
| 表 | 作用 | 关键列 |
|---|---|---|
accounts |
用户钱包 | balance DECIMAL CHECK(>=0) |
products |
商品目录 | embedding VECF32(4) + description TEXT(全文)+ product_id BIGINT(支持 HNSW) |
inventory |
库存 | stock CHECK(>=0) |
orders / order_items |
订单(事务写入) | |
sales |
销售流水(3000 行,半年) | 分析用事实表 |
assets |
非结构化资产登记 | file_link DATALINK |
商品向量 embedding 的 4 个维度语义为 [科技感, 运动属性, 户外属性, 高端定位],取值 0~1,便于直观验证相似度。
- 原子提交:一笔下单 = 扣余额 + 扣库存 + 写订单 + 写明细,四表一致变更后
COMMIT。 - 主动回滚:事务内可见改动,
ROLLBACK后外部无感知(隔离性 + 原子性)。 - 约束保护 + 失败回滚:余额不足触发
CHECK(balance>=0),整笔回滚,先扣的库存/订单一并撤销,零脏数据。
分组聚合、占比窗口、RANK()、LAG() 环比、累计窗口、PARTITION BY 分区排名、WITH ROLLUP 多维小计;
最后对内置 TPC-H SF1(约 590 万行 lineitem) 跑 Q1 风格聚合,体现列存大数据量分析性能。
- A. 快照 / 时间旅行 / 回滚:
CREATE SNAPSHOT(≈ commit/tag)→ 误改全场价格 →{snapshot=...}时间旅行读历史 →RESTORE ... FROM SNAPSHOT一键回滚 →CREATE PITR连续时间点恢复。 - B. 数据分支 Data Branch(≈ git branch/merge):
DATA BRANCH CREATE TABLE 提案分支 FROM 主表拉分支(与主表完全独立);- 在分支上改价/上新/下架;
DATA BRANCH DIFF 分支 AGAINST 主表看差异(全列逐行 INSERT/DELETE/UPDATE,或OUTPUT SUMMARY增删改计数 /COLUMNS(...)投影);DATA BRANCH MERGE 分支 INTO 主表 WHEN CONFLICT ACCEPT|SKIP|FAIL合并;- 分支血缘见
mo_catalog.mo_branch_metadata。
⚠️ DATA BRANCH DIFF全列输出当前不支持 DECIMAL/向量列(报unsupported mysql type 0),故分支演示用 INT「分」存价;含 DECIMAL 的表可用OUTPUT SUMMARY或COLUMNS(...)规避。⚠️ v3.0.11:DATA BRANCH CREATE若语句前带注释会报cannot find src and dst table。MatrixOne Cloud Web 控制台会自动给每条语句加/* cloud_user */前缀,导致这一句在控制台里失败 —— 请用 mysql 命令行运行03_git4data.sql(DIFF/MERGE 不受影响)。
- 向量:
HNSW索引 +l2_distance/cosine_distance相似度 Top-K。 - 全文:
FULLTEXT ... WITH PARSER ngram(中文)+MATCH ... AGAINST,含自然语言、布尔模式、相关度打分。
- 向量 + 标量过滤;
- 一条 SQL 三路信号:全文命中 + 价格过滤 + 向量语义排序;
- RRF 倒数排名融合:关键词召回 ⊕ 向量语义召回,同时命中两路的商品被显著提权(典型 Hybrid Search)。
CREATE STAGE 指向对象存储(演示用腾讯云 COS,S3 兼容)统一治理外部数据源;save_file() 把商品手册等非结构化文件写入对象存储;
DATALINK 列在 assets 表登记资产引用;load_file() 从对象存储实时读取文件内容并与结构化商品 JOIN,实现结构化 + 非结构化一体化查询;ALTER STAGE SET ENABLE 启停治理。
⚠️ 云上必须用对象存储 stage(S3/OSS/COS),不要用file://本地 stage——那会写到集群节点临时磁盘,非持久、跨节点不可靠。 运行06_stage.sql前,请把其中的CREDENTIALS(<YOUR_ACCESS_KEY_ID>等占位符)和 bucket 换成你自己的对象存储凭据。save_file不覆盖已存在对象,重复运行会报already exists(--force下可忽略,load_file/JOIN 仍正常)。
用库内原生 DDL 定义定时作业,由 MatrixOne 自身调度执行(已在云端 v3.0.11 实测自动触发):
CREATE TASK sales_rollup_task
SCHEDULE '0 0 2 * * *' TIMEZONE 'Asia/Shanghai' -- cron 六段式:秒 分 时 日 月 周
RETRY 1 TIMEOUT '5m'
AS BEGIN
INSERT INTO mo_demo.sales_daily_summary (...) SELECT ... FROM mo_demo.sales GROUP BY sale_date
ON DUPLICATE KEY UPDATE ...; -- 幂等增量刷新
END;
EXECUTE TASK sales_rollup_task; -- 手动立即触发
SHOW TASKS; -- 任务定义与状态
SHOW TASK RUNS FOR sales_rollup_task; -- 执行历史:触发方式/状态/耗时/影响行数
ALTER TASK sales_rollup_task SUSPEND; -- 暂停 / RESUME 恢复 / SET SCHEDULE 改排程必须用文件方式执行(
mysql ... < 07_scheduled_task.sql):任务体含分号,脚本用DELIMITER改写终止符;用-e单条传入会被客户端在分号处截断。 备注:MySQL 的CREATE EVENT不被支持(应改用CREATE TASK);CREATE CDC是另一种「持续同步任务」,但云上免费版复合登录名 + 含@密码无法写进 CDC 连接 URI。
- 中文列别名需用反引号包裹:
AS \销售额``。 generate_series(a,b)列名为result;rand()不接受整型种子(造数用确定性取模分布)。- 全文索引:中文需
WITH PARSER ngram;MATCH()...AGAINST()作为评分投影时不能再被ROUND()等函数包裹,且不能出现在INSERT...SELECT或与其它表 JOIN 的多 CTE 里(否则报 full table scan with fulltext search not supported)。混合检索因此采用「两路召回各自物化为普通表,再做纯关系融合」。 - 向量
HNSW索引要求主键为 BIGINT(故products.product_id用 BIGINT);IVFFLAT无此限制。 RESTORE需指定账户名:RESTORE ACCOUNT \` DATABASE TABLE FROM SNAPSHOT ;`- 云上
SELECT ... INTO OUTFILE不支持;Stage 写文件用save_file();datalink仅支持file:///stage://(不支持https)。 SHOW STAGES用LIKE过滤(不支持WHERE)。- MatrixOne Cloud Web 控制台:
SELECT ...; -- 注释(行尾注释)会被控制台按;拆出一条"纯注释语句"并显示它的空结果,看起来像"返回空"——这是控制台显示问题,数据本身正确(命令行/驱动返回正常)。本仓库脚本已尽量把注释放在语句上方,避免该现象。
mysql -h <host> -P 6001 -u '<account>:admin:accountadmin' -p'<password>' < sql/99_cleanup.sql