sharding-jdbc 4 + pagehelper + group by 分表异常

当使用PageHelper和Sharding-JDBC时,遇到带有GroupBy的SQL语句无法正确路由到分表的情况。PageHelper默认将SQL改写为先进行count操作,但不适用于包含聚合函数和GroupBy的复杂查询。文中介绍了这个问题的具体表现,并提出了通过自定义count语句ID来解决这个问题的方法,即为原始查询添加 '_COUNT' 后缀,以确保分表的正确路由。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分表 + pagehelper + group by 语句的问题

PageHelper为了算总记录条数,会改写原始sql,做1次count,比如:

select order_id, order_name, order_date from t_order_logic_0 where order_date='2020-09-06';

会首先被改写为:

select count(0) from t_order_logic_0 where order_date='2020-09-06';

然后再由sharding-jdbc改写成:(精确路由)

select count(0) from t_order_0 where order_date='2020-09-06';

对于简单语句,这样没什么问题。但是如果原始语句上,有一些聚合函数或group by,比如下面这样:

在这里插入图片描述
 如上图,加了group by 后,下面的语句

SELECT count(0) FROM (SELECT order_id FROM t_order_logic WHERE order_date = ? GROUP BY order_id) table_count

sharding-jdbc并不能正确解析为t_order_0,仍然还是t_order_logic

SELECT count(0) FROM (SELECT order_id FROM t_order_logic WHERE order_date = ? GROUP BY order_id) table_count ::: [2020-09-06]

解决办法:pagehelper对于count语句,允许用户自定义,只要在原来的语句id,加上“_COUNT”

在这里插入图片描述

<select id="selectList2" resultMap="BaseResultMap">
select order_id from t_order_logic${tableIndex} where order_date=#{orderDate} group by order_id
</select>

<select id="selectList2_COUNT" resultType="long">
select count(1) from t_order_logic${tableIndex} where order_date=#{orderDate} group by order_id
</select>

在这里插入图片描述

Sharding-JDBC 是一个强大的分库分表中间件,它支持多种 SQL 语法,以便在分库分表的环境中正常运行。以下是 Sharding-JDBC 支持的主要 SQL 语法: 1. **DQL(数据查询语言)**: - `SELECT`:支持基本的查询语句,包括 `WHERE`、`ORDER BY`、`GROUP BY`、`LIMIT` 等子句。 - 聚合函数:如 `COUNT`、`SUM`、`AVG`、`MAX`、`MIN` 等。 - 子查询:支持在 `SELECT`、`FROM`、`WHERE` 等子句中使用子查询。 2. **DML(数据操作语言)**: - `INSERT`:支持单条插入和批量插入。 - `UPDATE`:支持单表更新操作。 - `DELETE`:支持单表删除操作。 3. **DDL(数据定义语言)**: - `CREATE TABLE`:支持创建表语句。 - `ALTER TABLE`:支持修改表结构语句。 - `DROP TABLE`:支持删除表语句。 4. **事务支持**: - Sharding-JDBC 支持本地事务和分布式事务,确保数据的一致性。 5. **分页查询**: - 支持 `LIMIT` 子句进行分页查询,但在分库分表环境下需要注意性能问题。 6. **复杂查询**: - 支持多表连接查询(如 `JOIN`),但需要注意数据分布和连接条件的设计。 7. **函数和表达式**: - 支持常用的 SQL 函数和表达式,如字符串函数、日期函数、数学函数等。 以下是一个简单的示例,展示了 Sharding-JDBC 支持的 SQL 语法: ```sql -- 创建表 CREATE TABLE user ( id BIGINT AUTO_INCREMENT, name VARCHAR(50), age INT, PRIMARY KEY (id) ); -- 插入数据 INSERT INTO user (name, age) VALUES ('Alice', 30), ('Bob', 25); -- 查询数据 SELECT id, name, age FROM user WHERE age > 20 ORDER BY age DESC LIMIT 10; -- 更新数据 UPDATE user SET age = age + 1 WHERE name = 'Alice'; -- 删除数据 DELETE FROM user WHERE name = 'Bob'; ``` 通过这些支持的 SQL 语法,Sharding-JDBC 能够在分库分表的环境中提供灵活且高效的数据操作能力。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值