# MyBatis ORM Performance Comparison **Repository Path**: zining_zhai_admin/my-batis-orm-performance-comparison ## Basic Information - **Project Name**: MyBatis ORM Performance Comparison - **Description**: MyBatis-Plus vs MyBatis-Flex 性能对比测试项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-11 - **Last Updated**: 2026-04-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MyBatis ORM Performance Comparison MyBatis-Plus vs MyBatis-Flex 性能对比测试项目 ## 项目概述 本项目用于对比 MyBatis-Plus 和 MyBatis-Flex 两个 ORM 框架在 **增删改查** 操作上的执行效率和吞吐量。 ### 技术版本 | 组件 | 版本 | |------|------| | Spring Boot | 3.5.13 | | MyBatis-Plus | 3.5.15 | | MyBatis-Flex | 1.11.6 | | MySQL | 8.0.33 | | JDK | 17 | ## 项目结构 ``` mybatis-orm-comparison/ ├── pom.xml # 父POM,管理依赖版本 ├── README.md # 项目文档 ├── mybatis-plus-demo/ # MyBatis-Plus 测试模块 (端口 8081) │ └── src/main/ │ ├── java/com/perf/plus/ │ │ ├── entity/ # 实体类 (Order, User) │ │ ├── mapper/ # Mapper接口 │ │ ├── service/ # 业务服务层 │ │ └── test/ # 数据生成器和性能测试 │ └── resources/ │ ├── application.yml # 应用配置 │ └── schema.sql # 数据库Schema └── mybatis-flex-demo/ # MyBatis-Flex 测试模块 (端口 8082) └── src/main/ ├── java/com/perf/flex/ │ ├── entity/ # 实体类 (Order, User) │ ├── mapper/ # Mapper接口 │ ├── service/ # 业务服务层 │ └── test/ # 数据生成器和性能测试 └── resources/ ├── application.yml # 应用配置 └── schema.sql # 数据库Schema ``` ## 数据库设计 ### 数据库配置 - **MyBatis-Plus**: `mybatis_plus_test` - **MyBatis-Flex**: `mybatis_flex_test` - **地址**: `10.31.1.99:3366` - **用户**: `root` ### 表结构 #### users 表 | 字段 | 类型 | 说明 | |------|------|------| | id | BIGINT | 主键,自增 | | user_name | VARCHAR(100) | 用户名 | | phone | VARCHAR(20) | 电话 | | email | VARCHAR(100) | 邮箱 | | create_time | DATETIME | 创建时间 | **索引**: `idx_user_name`, `idx_phone` #### orders 表 | 字段 | 类型 | 说明 | |------|------|------| | id | BIGINT | 主键,自增 | | order_no | VARCHAR(50) | 订单号 | | user_id | BIGINT | 用户ID (外键) | | user_name | VARCHAR(100) | 用户名 | | user_phone | VARCHAR(20) | 用户电话 | | total_amount | DECIMAL(12,2) | 订单总金额 | | discount_amount | DECIMAL(12,2) | 折扣金额 | | freight_amount | DECIMAL(12,2) | 运费 | | tax_amount | DECIMAL(12,2) | 税费 | | status | INT | 订单状态 (0-4) | | status_name | VARCHAR(50) | 状态名称 | | shipping_address | VARCHAR(255) | 收货地址 | | shipping_city | VARCHAR(50) | 收货城市 | | shipping_province | VARCHAR(50) | 收货省份 | | shipping_zip_code | VARCHAR(10) | 邮编 | | payment_method | VARCHAR(50) | 支付方式 | | payment_no | VARCHAR(50) | 支付流水号 | | payment_time | DATETIME | 支付时间 | | delivery_method | VARCHAR(50) | 配送方式 | | tracking_no | VARCHAR(50) | 物流单号 | | delivery_time | DATETIME | 发货时间 | | receive_time | DATETIME | 收货时间 | | buyer_note | VARCHAR(500) | 买家备注 | | seller_note | VARCHAR(500) | 卖家备注 | | item_count | INT | 商品数量 | | item_names | VARCHAR(500) | 商品名称列表 | | create_time | DATETIME | 创建时间 | | update_time | DATETIME | 更新时间 | | deleted | TINYINT | 逻辑删除标记 | **索引**: ```sql -- 单字段索引 INDEX idx_user_id (user_id) INDEX idx_status (status) INDEX idx_create_time (create_time) INDEX idx_order_no (order_no) INDEX idx_payment_time (payment_time) INDEX idx_delivery_time (delivery_time) INDEX idx_tracking_no (tracking_no) -- 复合索引 (覆盖常见查询) INDEX idx_user_status (user_id, status) INDEX idx_user_create_time (user_id, create_time) INDEX idx_status_create_time (status, create_time) INDEX idx_status_amount (status, total_amount) ``` ## 快速开始 ### 1. 创建数据库和表 ```bash # MyBatis-Plus mysql -h 127.0.0.1 -P 3306 -u root -root < sql/schema.sql ### 2. 生成测试数据 ```bash # MyBatis-Plus (生成 10万用户 + 100万订单) cd mybatis-plus-demo mvn spring-boot:run # MyBatis-Flex (生成 10万用户 + 100万订单) cd mybatis-flex-demo mvn spring-boot:run ``` **配置参数** (在 `application.yml` 或命令行中设置): ```yaml data: count: 1000000 # orders 数量 batch: 1000 # 批量插入大小 users: 100000 # users 数量 ``` ### 3. 运行性能测试 ```bash # MyBatis-Plus cd mybatis-plus-demo mvn spring-boot:run # MyBatis-Flex cd mybatis-flex-demo mvn spring-boot:run ``` **测试类型** (通过 `application.yml` 配置或启动参数): ```yaml run: test: all # simple | complex | mixed | all ``` ## 测试方案详解 ### 测试类型 #### 1. Simple CRUD (简单增删改查) **目的**: 评估各框架在基础单表操作上的性能 | 操作 | 测试规模 | 说明 | |------|----------|------| | INSERT | 100 条/次 | 批量插入,测试入库效率 | | SELECT_BY_ID | 1000 次 | 根据主键查询,测试单记录读取 | | UPDATE | 1000 次 | 更新已有记录,测试事务处理 | | DELETE | 100 条/次 | 批量删除,测试软删除/硬删除 | **测试流程**: 1. **预热**: 100 次 INSERT + DELETE 2. **INSERT**: 批量插入 100 条记录,计时 3. **SELECT**: 使用 INSERT 后的自增 ID,循环查询 1000 次 4. **UPDATE**: 循环更新同一记录 1000 次 5. **DELETE**: 批量删除 INSERT 的 100 条记录 #### 2. Complex Query (复杂查询) **目的**: 评估各框架在多表关联和聚合查询上的性能 | 操作 | 测试规模 | 说明 | |------|----------|------| | JOIN_QUERY | 100 次 | 多表 JOIN 查询 (orders + users) | | AGGREGATION | 100 次 | 分组聚合统计查询 | **JOIN 查询 SQL**: ```sql SELECT o.*, u.user_name as buyer_name, u.phone as buyer_phone FROM orders o LEFT JOIN users u ON o.user_id = u.id WHERE o.status = ? AND o.create_time BETWEEN ? AND ? AND o.total_amount >= ? ORDER BY o.create_time DESC LIMIT ? ``` **聚合查询 SQL**: ```sql SELECT user_id, COUNT(*) as order_count, SUM(total_amount) as total_amount FROM orders WHERE create_time BETWEEN ? AND ? GROUP BY user_id HAVING COUNT(*) > ? LIMIT ? ``` #### 3. Mixed Workload (混合负载) **目的**: 模拟真实业务场景的混合读写操作 | 操作 | 权重 | 10000次中的预期次数 | |------|------|---------------------| | SELECT | 50% | ~5000 次 | | INSERT | 20% | ~2000 次 | | UPDATE | 20% | ~2000 次 | | DELETE | 10% | ~1000 次 | **测试流程**: 1. **INSERT**: 插入订单并记录返回的自增 ID 2. **SELECT**: 使用已插入记录的 ID 进行查询 3. **UPDATE**: 对已插入记录进行更新 4. **DELETE**: 删险已插入记录 **关键实现**: 维护 `availableIds` 列表跟踪已插入记录的 ID,确保 UPDATE/DELETE 操作使用真实存在的 ID。 ### 输出示例 测试完成后统一输出结果表格: ``` ============================================ MyBatis-Plus Performance Results ============================================ | Test Type | Operation | Count | Time(ms) | Throughput | -----------------|----------------|-------|----------|--------------------| | Simple CRUD | INSERT | 100 | 123 | 812.45 ops/s | | Simple CRUD | SELECT_BY_ID | 1000 | 89 | 11235.96 ops/s | | Simple CRUD | UPDATE | 1000 | 145 | 6896.55 ops/s | | Simple CRUD | DELETE | 100 | 34 | 2941.18 ops/s | | Complex Query | JOIN_QUERY | 100 | 567 | 176.37 ops/s | | Complex Query | AGGREGATION | 100 | 234 | 427.35 ops/s | | Mixed | SELECT | 4987 | 2345 | 2127.08 ops/s | | Mixed | INSERT | 2013 | 2345 | 858.42 ops/s | | Mixed | UPDATE | 1998 | 2345 | 852.03 ops/s | | Mixed | DELETE | 1002 | 2345 | 427.29 ops/s | ============================================ ``` ## 测试建议 ### 数据量级建议 | 级别 | users | orders | 适用场景 | |------|-------|--------|----------| | 1万级 | 1,000 | 10,000 | 快速验证 | | 10万级 | 10,000 | 100,000 | 常规测试 | | 100万级 | 100,000 | 1,000,000 | 压力测试 | ### 测试注意事项 1. **关闭 SQL 日志**: 配置 `log-impl: NoLoggingImpl` 避免日志影响性能测试结果 2. **预热**: Simple CRUD 测试前有 100 次预热操作 3. **数据库统一**: 两个框架使用统一的数据库,避免数据不同导致的性能差异 4. **多次测试**: 建议每个测试运行 3 次取平均值