1. 项目背景与测试环境配置
最近在分析金融数据时遇到了一个典型问题:当处理千万级股票交易记录时,传统关系型数据库的查询性能开始捉襟见肘。这促使我对比测试了DuckDB和MySQL在相同硬件环境下处理超大规模数据集的性能差异。测试环境选用了一台配备24核CPU和64GB内存的工作站,确保两种数据库都能充分发挥硬件性能。
测试使用的数据集包含三个关键表:
- 主表stock_daily(1415万行,1.15GB CSV):存储股票每日交易数据
- 维度表stock_base(5362行):股票基本信息
- 维度表stock_company(5146行):上市公司详情
所有测试都在禁用查询缓存的情况下进行,确保每次查询都是真实的性能反映。MySQL 8.0.12采用默认配置,仅针对测试表建立了必要的索引(主键和交易日期索引)。DuckDB 1.5.1则直接读取CSV文件,不进行任何预处理。
重要提示:测试使用机械硬盘而非SSD,这放大了I/O性能差异。实际生产环境中若使用SSD,性能差距会有所缩小。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础查询性能对比
2.1 简单聚合查询
最基本的count(*)查询就显示出巨大差异:
sql复制-- MySQL耗时8.038秒
SELECT COUNT(*) FROM stock_daily;
-- DuckDB耗时0.452秒
SELECT COUNT(*) FROM 'stock_daily.csv';
DuckDB仅用MySQL 5.6%的时间就完成了全表计数。这种优势在分组聚合中更加明显:
sql复制-- MySQL耗时2.627秒
SELECT ts_code, COUNT(*) FROM stock_daily GROUP BY ts_code;
-- DuckDB耗时0.478秒
SELECT ts_code, COUNT(*) FROM 'stock_daily.csv' GROUP BY ts_code;
2.2 排序查询性能
当引入ORDER BY子句后,MySQL的耗时急剧上升:
sql复制-- MySQL耗时13.16秒
SELECT ts_code, COUNT(*) AS days
FROM stock_daily
GROUP BY ts_co
