首页 > 解决方案 > 春季批处理:MySQL分页

问题描述

我想从大表 MySQL 在 Kafka 主题中发送 600 000 000 条消息。我想将 Spring Batch 用于此用途,但它使用查询类型:

SELECT c1, c2, c3 FROM t1 LIMIT offset, size;

在 spring-batch/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/MySQLPagingQueryProvider.java 中生成:

public String generateJumpToItemQuery(int itemIndex, int pageSize) {
    int page = itemIndex / pageSize;
    int offset = (page * pageSize) - 1;

    offset = offset<0 ? 0 : offset;

    String limitClause = new StringBuilder().append("LIMIT ").append(offset).append(", 1").toString();

    return SqlPagingQueryUtils.generateLimitJumpToQuery(this, limitClause);

}

这个解决方案非常慢,因为LIMIT offset, size每次迭代都需要重新读取。我更喜欢:

SELECT c1, c2, c3 FROM t1 WHERE primary > last_primary_lot LIMIT size;

这是可能的 ?

标签: javamysqlspringspring-batch

解决方案


推荐阅读