鱼弦:公众号:红尘灯塔,CSDN内容合伙人、CSDN新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)



项目中,有三张表。它们有一些共同的字段。除了单独对这三张表做增删改查外,还会对这三张表的全部数据按时间排序,做分页查询。区别于一般的水平分表,数据在这三张表中的分布没有什么规律,极端可能只有一张表中有数据。

怎样分页查效率高点。有没有必要将三张表中的记录全部放在es的一个索引中,分页查从es查。单表更新时也去更新es。

1. 普通的多表分页查询

如果直接在数据库中进行多表分页查询,可以使用联合查询来实现。首先,需要确定哪个字段用来排序,这里假设是按照时间排序。然后,使用分页查询的语法来限制每页的数据数量和偏移量,获取指定页的数据。

示例代码如下:

// 每页数据数量
 int pageSize = 10;
 // 当前页码
 int pageNum = 1;
  
 // 排序字段
 String orderBy = "time";
  
 // 计算偏移量
 int offset = (pageNum - 1) * pageSize;
  
 // 执行多表联合查询,并按照时间排序
 String sql = "SELECT t1.*, t2.*, t3.* FROM table1 t1, table2 t2, table3 t3 " +
              "WHERE t1.id = t2.id AND t2.id = t3.id " +
              "ORDER BY " + orderBy + " DESC " +
              "LIMIT " + offset + ", " + pageSize;
  
 // 执行查询并处理结果
 // ...

2. 将数据存储到Elasticsearch中进行分页查询

如果数据量较大,或者希望提高查询效率,可以考虑将三张表中的记录全部放在Elasticsearch的一个索引中,使用Elasticsearch来进行分页查询。在每次单表增删改查时,也需要更新Elasticsearch中的数据。

首先,需要将三张表中的数据同步到Elasticsearch中。可以使用定时任务或者监听数据库变化的方式实现数据同步。

示例代码如下:

// 每页数据数量
 int pageSize = 10;
 // 当前页码
 int pageNum = 1;
  
 // 排序字段
 String orderBy = "time";
  
 // 计算偏移量
 int offset = (pageNum - 1) * pageSize;
  
 // 构建分页查询的DSL语句
 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
         .sort(orderBy, SortOrder.DESC)
         .from(offset)
         .size(pageSize);
  
 // 构建查询请求
 SearchRequest searchRequest = new SearchRequest("your_index");
 searchRequest.source(sourceBuilder);
  
 // 执行查询并处理结果
 // ...

需要注意的是,每次进行增删改查操作时,都需要同步更新Elasticsearch中的数据。可以使用Elasticsearch的Java客户端,根据具体的需求编写更新逻辑。

示例代码如下:

// 更新操作
 IndexRequest indexRequest = new IndexRequest("your_index")
         .id(yourId)
         .source("field1", value1)
         .source("field2", value2)
         // ...
         .opType(DocWriteRequest.OpType.UPDATE);
  
 // 执行更新
 IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);

3. 比较两种方法的优劣

采用普通的多表分页查询的方式,可以直接在数据库中进行查询,不需要维护额外的索引。适用于数据量较小或者对查询效率要求不高的情况。但是在数据量较大或者查询效率要求较高时,可能会存在性能瓶颈。

采用将数据存储到Elasticsearch中进行分页查询的方式,可以借助Elasticsearch的强大查询和分页功能,提高查询效率。但是需要维护额外的索引,增加了系统的复杂性。

根据具体的业务需求和系统性能要求来选择合适的方法。如果数据量较小或者查询效率要求不高,可以使用普通的多表查询;如果数据量较大或者查询效率要求较高,可以考虑将数据存储到Elasticsearch中。需要权衡数据同步和查询性能的关系。