SimpleDatabaseBenchmark - 数据库基准测试工具

February 8, 2026 · View on GitHub

数据库性能对比测试工具,支持 SQLite、MySQL、MariaDB、PostgreSQL、SQL Server、MongoDB、Oracle 等多种数据库。

一款轻量级 .NET 控制台工具,帮助开发者快速对比不同数据库的读写性能,一键生成基准测试报告,让数据库选型更有据可依。

如果对您有帮助,请帮助点个 Star ⭐️

欢迎 fork 本项目并提出您的建议和贡献!

综合评价:所有数据库都非常优秀,百万级数据随便选,选择适合自己业务场景的数据库才是最重要的。

🏆 性能对比分析

📈 综合排名

排名数据库综合评分适用场景
🥇MongoDB 8.2⭐⭐⭐⭐⭐高并发写入、NoSQL 场景、10万+/s
🥈PostgreSQL 18⭐⭐⭐⭐⭐通用场景、数据分析
🥉SQLite 3⭐⭐⭐⭐轻量级、嵌入式、读多写少
4MariaDB 11.8⭐⭐⭐⭐略优于 MySQL
5MySQL 8.4⭐⭐⭐⭐传统 Web 应用
6SQL Server 2022⭐⭐⭐企业级 Windows 生态
7Oracle 23⭐⭐⭐大型企业应用

最终容器状态

NAMEMEM USAGE / LIMITAVG CPU %
bench_mongodb281.6MiB / 8GiB32%
bench_postgresql642.4MiB / 8GiB20%
bench_mariadb787.0MiB / 8GiB19%
bench_mysql1.313GiB / 8GiB16%
bench_oracle1.892GiB / 8GiB43%
bench_sqlserver4.151GiB / 8GiB80%

单条/批量/聚合/百万数据索引性能 (毫秒 - 越小越好)

操作类型操作名称MariaDBMongoDBMySQLOraclePostgreSQLSQLiteSQLServer最快
AggregationGroupBy3.202.606.202.201.802.0031.40PostgreSQL
AggregationStatistics5.606.0013.007.006.201.809.00SQLite
BatchDelete55.0030.4098.60498.8018.4054.20212.00PostgreSQL
BatchInsert1445.4032.201632.804409.20577.60843.204813.60MongoDB
BatchSelect10.8025.2014.8044.2070.8015.8015.60MariaDB
BatchUpdate1420.40146.201516.004618.80359.00423.402645.40MongoDB
IndexQueryComplexCondition10160.003736.001559.001664.004427.0058613.001190.00SQLServer
IndexQueryCompositeIndex_RegionDept90.00102.0094.00561.0063.00104.00188.00PostgreSQL
IndexQueryCompositeIndex_StatusCatPri107.0096.00101.00605.0071.00148.00197.00PostgreSQL
IndexQueryNoIndex_FullScan5892.002869.005511.002482.00516.006717.002476.00PostgreSQL
IndexQueryOrderBy10174.0025846.0047402.0032376.003900.0061260.004186.00PostgreSQL
IndexQueryPagination182.00166.00254.00388.0079.00102.00272.00PostgreSQL
IndexQueryPrefixQuery_Name42167.0054.0060472.0021074.007745.0037612.0015196.00MongoDB
IndexQueryPrimaryKey57.0055.0063.00207.0045.0024.00115.00SQLite
IndexQueryRangeQuery_Date89.0099.0096.00701.0064.00161.00200.00PostgreSQL
IndexQueryRangeQuery_Salary96.00107.00104.001634.0082.00189.00192.00PostgreSQL
IndexQueryRangeQuery_Score98.00107.00116.001733.0084.00188.00192.00PostgreSQL
IndexQuerySingleIndex_Category82.00112.0088.001190.00741.0073.00121.00SQLite
IndexQuerySingleIndex_Status86.00115.0088.00116.001106.0075.00428.00SQLite
MillionDataAggregation454.00561.00478.00269.00197.00834.00456.00PostgreSQL
MillionDataCleanup18202.0014862.0025360.001838724.003699.00132571.0021157.00PostgreSQL
MillionDataGroupBy1767.00997.002645.001423.00174.0012615.00116.00SQLServer
MillionDataPrepareData24269.009346.0025807.001759340.0034346.00139529.0030947.00MongoDB
SingleDelete1092.20538.402711.601609.20847.603140.001567.60MongoDB
SingleInsert1189.00393.802789.801142.00971.003115.201516.40MongoDB
SingleSelect508.00526.60582.801013.20394.40193.801063.40SQLite
SingleUpdate1357.80585.802885.401767.20993.603142.204297.00MongoDB

🔴 存在明显性能问题的数据库

1. SQL Server - 最严重的性能问题

问题类型具体表现
批量写入极慢Batch Insert: 4833.60ms(MariaDB 仅 365.40ms,慢 13 倍
批量更新极慢Batch Update: 2587.40ms(MariaDB 仅 253.00ms,慢 10 倍
单条更新慢Single Update: 3575.00ms(PostgreSQL 仅 966.40ms,慢 3.7 倍
聚合分组慢GroupBy: 29.20ms(PostgreSQL 仅 1.20ms,慢 24 倍
资源消耗巨大内存占用 3.251GiB,CPU 占用 86%(远超其他数据库)

2. MySQL - 中等性能问题

问题类型具体表现
单条操作慢Single Insert: 3226.40ms(PostgreSQL 仅 962.40ms,慢 3.4 倍
单条删除慢Single Delete: 3060.80ms(PostgreSQL 仅 831.60ms,慢 3.7 倍
排序查询极慢OrderBy: 47803.00ms(SQL Server 4056.00ms,慢 12 倍
前缀查询慢PrefixQuery_Name: 61143.00ms(PostgreSQL 9938.00ms,慢 6 倍

说明:MySQL 分页慢可以采取延迟加载,查询时不要回表,根据 ID 查询结果后再批量获取数据,就不会有性能问题了。

3. MariaDB - 部分性能问题

问题类型具体表现
全表扫描慢NoIndex_FullScan: 5958.00ms(PostgreSQL 522.00ms,慢 11 倍
排序查询慢OrderBy: 10451.00ms(SQL Server 4056.00ms,慢 2.6 倍
前缀查询慢PrefixQuery_Name: 43227.00ms(PostgreSQL 9938.00ms,慢 4.3 倍

4. MongoDB - Count 最大短板

  • 统计性能较差:在超过百万数据量时,精确 Count 操作远慢于关系型数据库,聚合分析能力弱
  • 弱事务:无法替代 RDBMS 处理转账、订单等业务
  • 弱 JOIN 支持:多表关联查询是灾难
  • 内存依赖极强:数据量超过内存 → 性能断崖式下降
  • 数据一致性弱:只保证主节点写入,多节点可能丢数据
  • 存储空间膨胀:实际存储空间比 SQL 数据库大 2-5 倍
MongoDB 批量写入所有数据库中最快!
MongoDB 超百万数据,统计性能严重下降!

特点:写多读少、数据量大、不需要关联查询
注意:不要精确分页、不需要复杂统计分析、不需要精确统计数量,因此 Count 一般查询最大返回 10万+ 记录即可
// _collection.CountDocuments(filter, new CountOptions() { Limit = 100000 });
// _collection.Find(filter, new FindOptions { AllowDiskUse = true }).Take(100000).Count();
// _collection.Find(filter, new FindOptions { AllowDiskUse = true }).Project(c => c.Id).Skip(100,000,000).Limit(100).ToList();

适合:
  📊 应用日志 / 访问日志 / 审计日志      
  📈 用户行为追踪 / 埋点数据            
  🔔 IoT 传感器数据采集                
  📝 API 请求记录                     
  💬 聊天消息存储              
  🎮 游戏事件流  
  📄 全文搜索

4. 性能表现优秀的数据库

PostgreSQL - 综合最佳

  • 28 项测试中赢得 20 项
  • 全表扫描仅 522ms(其他数据库 2500-6000ms)
  • 内存占用低

5. 综合评价

数据库性能问题严重程度主要问题
SQL Server🔴 严重批量操作极慢、资源消耗巨大
MySQL🟠 中等单条操作慢、排序/前缀查询极慢
MariaDB🟡 轻微无索引查询慢、排序查询较慢
PostgreSQL🟢 无综合性能最佳
SQLite🟢 无轻量场景表现良好
MongoDB🟢 无NoSQL 场景最佳

建议:对于通用场景优先选择 PostgreSQL;如果必须使用 SQL Server,需要优化批量操作策略;MySQL/MariaDB 需要注意索引优化和排序查询的性能。

功能特点

  • 支持多种数据库: MySQL, MariaDB, SQL Server, PostgreSQL, SQLite, MongoDB, Oracle
  • 多种测试场景:
    • 单条增删改查 (CRUD)
    • 批量增删改查
    • 统计汇总 (Count, Sum, Avg, Max, Min)
    • 分组汇总 (Group By)
  • 百万级数据索引测试:
    • 主键查询、单字段索引查询、复合索引查询
    • 范围查询 (评分、日期、薪资)
    • 前缀模糊查询、分页查询、排序查询
    • 复杂条件组合查询
    • 无索引全表扫描对比测试
    • 百万级数据聚合统计和分组统计
  • 性能监控:
    • 操作耗时 (毫秒)
    • 每秒操作数 (OPS)
    • CPU 消耗 (%)
    • 内存消耗
  • 详细日志: 使用 Serilog,同时输出到控制台和文件
  • 自动报告: 生成 Markdown 格式的测试报告

技术栈

  • .NET 8.0
  • FreeSql: MySQL, MariaDB, SQL Server, PostgreSQL, SQLite, Oracle 的 ORM
  • MongoDB Driver: MongoDB 官方驱动
  • Serilog: 日志框架

项目结构

SimpleDatabaseBenchmark/
├── src/
│   └── SimpleDatabaseBenchmark/
│       ├── Models/           # 数据模型
│       ├── Services/         # 测试服务
│       ├── Reports/          # 报告生成
│       ├── Utils/            # 工具类
│       ├── Program.cs        # 程序入口
│       └── appsettings.json  # 配置文件
├── results/                  # 测试报告
└── README.md

快速开始

1. 环境要求/准备/规则

  • .NET 8.0
  • 数据库服务统一限制内存 8G
  • 至少一个数据库服务(MySQL/MariaDB/SQL Server/PostgreSQL/MongoDB/Oracle)
  • SQLite 无需额外安装
  • MySQL/MariaDB 配置 1G buffer pool,并开启 local_infile
  • PostgreSQL shared_buffers 配置为 1G
  • SQL Server 如果不是通过脚本启动,请手动创建数据库 benchmark_test
  • 完全模拟生产环境
  • 初始化百万数据默认使用 BulkCopy 方式插入,Oracle 采用普通批量插入(非常慢)

2. 启动数据库

使用 Docker 快速启动所有测试数据库:

SQL Server 启动容器后需要手动创建 benchmark_test 数据库。

# Linux/macOS
chmod +x start.sh
./start.sh

# Windows (PowerShell)
.\start.ps1

3. 数据库连接信息

数据库地址端口用户名密码数据库名
MySQLlocalhost3306root123456benchmark_test
MariaDBlocalhost3307root123456benchmark_test
SQL Serverlocalhost1433saBenchmark@123benchmark_test
PostgreSQLlocalhost5432postgres123456benchmark_test
MongoDBlocalhost27017--benchmark_test
Oraclelocalhost1521SYSTEM123456FREEPDB1
SQLite----benchmark_test.db

编辑 appsettings.json 文件,配置各数据库的连接字符串:

{
  "ConnectionStrings": {
    "MySql": "Server=localhost;Port=3306;Database=benchmark_test;Uid=root;Pwd=123456;AllowPublicKeyRetrieval=true;AllowLoadLocalInfile=true;",
    "MariaDb": "Server=localhost;Port=3307;Database=benchmark_test;Uid=root;Pwd=123456;AllowPublicKeyRetrieval=true;AllowLoadLocalInfile=true;",
    "SqlServer": "Server=localhost,1433;Database=benchmark_test;User Id=sa;Password=Benchmark@123;Persist Security Info=True;TrustServerCertificate=True;",
    "PostgreSql": "Host=localhost;Port=5432;Database=benchmark_test;Username=postgres;Password=123456;",
    "Sqlite": "Data Source=benchmark_test.db;",
    "MongoDb": "mongodb://localhost:27017",
    "Oracle": "Data Source=localhost:1521/FREEPDB1;User Id=SYSTEM;Password=123456;"
  }
}

提示:如果某个数据库未安装,可以将对应的连接字符串留空或删除,程序会自动跳过。

4. 停止数据库

# Linux/macOS
./stop.sh

# Windows (PowerShell)
.\stop.ps1

3. 运行测试

cd src/SimpleDatabaseBenchmark
dotnet run

或者使用 Release 模式运行以获得更准确的性能数据:

dotnet run -c Release

4. 查看结果

  • 测试报告: results/ 目录下的 Markdown 文件
  • 日志文件: logs/ 目录下的日志文件

测试配置

可以在 appsettings.json 中调整测试参数:

基础测试配置

{
  "BenchmarkSettings": {
    "SingleOperationCount": 1000,
    "BatchSize": 1000,
    "BatchOperationCount": 10,
    "WarmupIterations": 3,
    "TestIterations": 5
  }
}
参数说明默认值
SingleOperationCount单条操作测试的记录数1000
BatchSize批量操作每批的记录数1000
BatchOperationCount批量操作的批次数10
WarmupIterations预热迭代次数3
TestIterations正式测试迭代次数5

百万级数据索引测试配置

{
  "BenchmarkSettings": {
    "EnableMillionDataTest": true,
    "MillionDataCount": 1000000,
    "MillionBatchSize": 10000,
    "IndexQueryCount": 100,
    "PageSize": 100,
    "PageCount": 100
  }
}
参数说明默认值
EnableMillionDataTest是否启用百万级数据索引测试false
MillionDataCount百万级测试的总数据量1000000
MillionBatchSize百万级数据插入的批次大小10000
IndexQueryCount索引查询测试的执行次数100
PageSize分页查询测试的每页记录数100
PageCount分页查询测试的总页数100

完整配置示例

{
  "ConnectionStrings": {
    "MySql": "Server=localhost;Port=3306;Database=benchmark_test;Uid=root;Pwd=123456;AllowPublicKeyRetrieval=true;AllowLoadLocalInfile=true;",
    "MariaDb": "Server=localhost;Port=3307;Database=benchmark_test;Uid=root;Pwd=123456;AllowPublicKeyRetrieval=true;AllowLoadLocalInfile=true;",
    "SqlServer": "Data Source=localhost;Initial Catalog=benchmark_test;User ID=sa;Password=Benchmark@123;Persist Security Info=True;TrustServerCertificate=True;",
    "PostgreSql": "Host=localhost;Port=5432;Database=benchmark_test;Username=postgres;Password=123456;",
    "Sqlite": "Data Source=benchmark_test.db;",
    "MongoDb": "mongodb://localhost:27017",
    "Oracle": "Data Source=localhost:1521/FREEPDB1;User Id=SYSTEM;Password=123456;"
  },
  "BenchmarkSettings": {
    "SingleOperationCount": 1000,
    "BatchSize": 1000,
    "BatchOperationCount": 10,
    "WarmupIterations": 3,
    "TestIterations": 5,

    "EnableMillionDataTest": true,
    "MillionDataCount": 1000000,
    "MillionBatchSize": 10000,
    "IndexQueryCount": 100,
    "PageSize": 100,
    "PageCount": 100
  },
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    }
  }
}

注意: 百万级数据测试会消耗较多时间和资源,建议在测试环境中运行。可根据实际需求调整 MillionDataCount 参数(如 100000、500000、1000000)。

百万级数据索引测试说明

EnableMillionDataTest 设置为 true 时,程序会在常规测试完成后执行以下索引性能测试:

测试流程

  1. 数据准备: 批量插入百万级测试数据
  2. 创建索引: 为各字段创建单字段和复合索引
  3. 索引查询测试: 执行多种索引查询场景
  4. 聚合统计测试: 百万级数据聚合和分组统计
  5. 数据清理: 清理测试数据(记录性能指标)

索引查询测试场景

测试类型测试名称说明
主键查询PrimaryKey按主键 ID 查询单条记录
单字段索引SingleIndex_Status按状态字段查询
单字段索引SingleIndex_Category按分类字段查询
复合索引CompositeIndex_RegionDept按地区+部门复合条件查询
复合索引CompositeIndex_StatusCatPri按状态+分类+优先级复合条件查询
范围查询RangeQuery_Score按评分范围查询
范围查询RangeQuery_Date按创建时间范围查询
范围查询RangeQuery_Salary按薪资范围查询
前缀查询PrefixQuery_Name按名称前缀模糊查询
分页查询Pagination带排序的分页查询
排序查询OrderBy多字段排序查询
复杂查询ComplexCondition多条件组合查询
全表扫描NoIndex_FullScan无索引字段模糊查询(对比测试)
百万数据清理MillionData_Cleanup百万级数据清理(删除所有测试数据)
百万数据分组MillionData_GroupBy百万级数据按分组统计
百万数据聚合MillionData_Aggregation百万级数据聚合统计
百万数据准备MillionData_PrepareData批量插入百万级测试数据

创建的索引

程序会自动创建以下索引用于测试:

索引名称索引字段索引类型
idx_statusStatus单字段索引
idx_categoryCategory单字段索引
idx_scoreScore单字段索引
idx_salarySalary单字段索引
idx_created_atCreatedAt单字段索引
idx_priorityPriority单字段索引
idx_nameName单字段索引(前缀)
idx_region_deptRegion, Department复合索引
idx_status_cat_priStatus, Category, Priority复合索引

测试数据字段

百万级测试数据包含以下字段,用于模拟真实业务场景:

字段名类型说明示例值
Idlong主键自增 ID1, 2, 3...
Namestring用户名User_12345_abc...
Emailstring邮箱user123@example.com
Ageint年龄18-65
Salarydecimal薪资30000-130000
Departmentstring部门Engineering, Sales, HR...
Categorystring分类Electronics, Clothing, Food...
Statusint状态0-待处理, 1-处理中, 2-已完成, 3-已取消
Scoredecimal评分0-100
Regionstring地区North, South, East, West...
Tagsstring标签hot,new / sale,popular...
Priorityint优先级1-5
Quantityint数量1-1000
IsActivebool是否激活true/false
CreatedAtDateTime创建时间过去一年内随机日期
ExpireAtDateTime?过期时间未来一年内随机日期或 null
Descriptionstring描述测试描述文本

测试用例说明

单条操作

  • Insert: 逐条插入记录
  • Select: 按主键逐条查询
  • Update: 逐条更新记录
  • Delete: 逐条删除记录

批量操作

  • Batch Insert: 批量插入记录
  • Batch Select: 分页批量查询
  • Batch Update: 批量更新记录
  • Batch Delete: 批量删除记录

统计汇总

  • Statistics: Count, Sum, Avg, Max, Min 聚合查询
  • GroupBy: 按部门分组统计

注意事项

  1. 测试前请确保数据库服务已启动
  2. 请在测试环境运行,避免影响生产数据
  3. 首次运行会自动创建测试数据库和表
  4. 每轮测试前会清空测试数据

性能参数

# 数据库参数说明
# Buffer Pool(数据库专用服务器)
innodb_buffer_pool_size = 服务器内存 × 0.7

# Log File Size (MariaDB 11)
innodb_log_file_size = innodb_buffer_pool_size × 0.25

# Redo Log Capacity (MySQL 8.4) 
innodb_redo_log_capacity = innodb_log_file_size × 2

许可证

MIT License

测试结果历史

数据库运维/备份