同一套 WooCommerce,换列存引擎后报表快了 10-83 倍:Percona 实测 MySQL + DuckDB

> 行存做交易、列存做分析,这个思路大家都在讲。Percona 这次给出了少见的端到端实测:同一套 WooCommerce 代码、同一批报表查询,底层从 InnoDB 换成 DuckDB 存储引擎,结果差出天际。原文发布于 2026-11-05。

测试架构:主库 InnoDB,副本 DuckDB

  • 主库(Source):Percona Server for MySQL 8.0.46,WooCommerce 表用默认引擎 InnoDB,InnoDB Buffer Pool 4 GiB
  • 副本(Replica):AliSQL 8.0.44-2——阿里基于 MySQL 8.0.44 的分支,内置 DuckDB 存储引擎(还有向量搜索、Flashback 等)
  • 通过 MySQL 异步复制把 OLTP 数据流到副本,force_innodb_to_duckdb 让复制建表自动落成列存
  • 数据规模:40 万订单、5,000 商品(用 WooCommerce Smooth Generator 灌入)
  • 报表流量用第二个 WooCommerce 实例承接(只改 wp-config.php 里的数据库 host),同一份代码分别打两个引擎
  • 存储开销先差一个数量级:InnoDB 目录 7.3 GiB,DuckDB 副本只要 601 MiB——磁盘占用缩小约 12 倍。

    报表性能:全部查询都是 DuckDB 更快

    场景 InnoDB DuckDB 提升
    内置报表(月度聚合,2024-01 至 2026-09) 5-16 秒 **1 秒内** 约 **10x-63x**
    分段报表(按小时/天/周/月 + segmentby) 分钟级 秒级 约 **14x-83x**
    第三方插件报表(Customer Analytics,11 个报表) — — 约 **2x-70x**
    直查实时订单表的 ad-hoc 聚合查询 约 **4 分 16 秒** 约 **4.1 秒** 约 **60x**

    方法学也做得干净:每个报表跑多轮取最快、两引擎不同时跑、先验证结果集一致、用 REST API 带 force_cache_refresh 强制绕过缓存计算。

    内置报表对比:

    内置报表

    分段报表(越细的分段差距越大):

    分段报表

    第三方插件报表(代码一行没改):

    插件报表

    直查实时数据的 ad-hoc 查询:

    Ad-hoc 实时查询

    为什么列存赢?

    物理层面的原因:行存把一行的所有列存在一起,分析查询要扫百万行、却只用其中三列,等于读一堆再扔掉;列存按列存放、同类型压缩率高、按批处理——读得少、读压缩、批处理,就是 10 倍到 80 倍差距的来源。

    上线前必须知道的坑

  • SQL 兼容性:DuckDB 引擎用自己的解析器,MySQL 特有语法(如 CAST(... UNSIGNED))会直接报错,需要改写(可用 ProxySQL Query Rewrite 自动化)
  • Collation 不一致:DuckDB 不走列级 collation,强制二进制比较——带重音的拼写和纯拼写会被分成两组(实测结果集差 2 个分组)。分组/JOIN 尽量用数字 ID,别用文本
  • DECIMAL 默认按 double 算:金额列求和用浮点,分位以下可能有差;要精确可关 duckdb_use_double_for_decimal
  • 外键级联:MySQL 9.6 起级联操作才写入 binlog,跨引擎复制才透明(WooCommerce 不用级联外键,本例无影响)
  • 可观测性弱:DuckDB 引擎只暴露少量状态变量,内存、落盘、执行过程基本是黑盒
  • Percona 明确说明:目前没有生产级 DuckDB 构建、不提供支持,本文属于测试性质
  • 小夏点评

  • 12 倍存储压缩 + 10-83 倍报表加速,意味着”报表库”这类只读副本完全可以列存化——省磁盘、省等待,用户还觉得网站变快了。
  • 坑集中在语义层:collation 和 decimal 会造成结果悄悄不一致,对账类报表上线前必须做双引擎结果比对,不能只看速度。
  • 对国内 IT 运维/开发者的启示:阿里 AliSQL 的 DuckDB 引擎第一次以”生产可用分支”的身份被实测背书,MariaDB 也在做类似集成——MySQL 生态的 HTAP 化已经从概念进入选型清单,做电商/报表架构时可以认真评估”主库行存 + 副本列存”这条路线。
  • 参考链接

  • 原文:https://www.percona.com/blog/(WooCommerce Analytics with DuckDB,2026-11-05)
  • AliSQL DuckDB 参数:https://github.com/alibaba/AliSQL/blob/master/wiki/duckdb/duckdb_variables-en.md
  • MySQL 9.6 外键变更:https://blogs.oracle.com/mysql/no-more-hidden-changes-how-mysql-9-6-transforms-foreign-key-management
  • 您可能还喜欢...

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注