使用ShardingSphere做数据库分片,当使用查询条件不包含分片字段时,就会报错:Not allow DML operation without sharding conditions。如果我要查询时不带分片字段条件,该如何处理呢?
⚙️ 配置proxy-hint-enabled
server.yaml设置proxy-hint-enabled为true
props:
#是否允许在 ShardingSphere-Proxy 中使用 Hint。使用 Hint 会将 Proxy 的线程处理模型由 IO 多路复用变更为每个请求一个独立的线程,会降低 Proxy 的吞吐量。
proxy-hint-enabled: true
🔧 配置分片算法
config-sharding.yaml设置为allow-range-query-with-inline-sharding: true
shardingAlgorithms:
database_inline:
type: INLINE
props:
algorithm-expression: ds_${user_id % 2}
allow-range-query-with-inline-sharding: true
说明:关于allow-range-query-with-inline-sharding字段,用到的有行表达式分片算法和复合行表达式分片算法。
以下是算法属性说明:
参考自官方文档:https://shardingsphere.apache.org/document/5.0.0/cn/features/sharding/concept/inline-expression/
行表达式分片算法
类型:INLINE
属性名称 | 数据类型 | 说明 | 默认值 |
---|---|---|---|
algorithm-expression | String | 分片算法的行表达式 | - |
allow-range-query-with-inline-sharding (?) | boolean | 是否允许范围查询。注意:范围查询会无视分片策略,进行全路由 | false |
复合行表达式分片算法
类型:COMPLEX_INLINE
属性名称 | 数据类型 | 说明 | 默认值 |
---|---|---|---|
sharding-columns (?) | String | 分片列名称,多个列用逗号分隔。如不配置无法则不能校验 | - |
algorithm-expression | String | 分片算法的行表达式 | - |
allow-range-query-with-inline-sharding (?) | boolean | 是否允许范围查询。注意:范围查询会无视分片策略,进行全路由 | false |
🔗 配置MySQL客户端连接
MySQL 客户端连接,默认是–skip-comments 过滤注释,要使用SQL Hint 功能,需要添加-c 选项保留注释,或–comments,例如:
mysql -h10.10.0.101 -P3307 -uroot -p --comments
💡 使用Hint查询
查询时带上注释hint
/* ShardingSphere hint: disableAuditNames=sharding_key_required_auditor */
select * from t_order;
或者
/* SHARDINGSPHERE_HINT: disableAuditNames=sharding_key_required_auditor */
select * from t_order;
效果如下: