不支持:不支持case when,having,union
可解析至第一个含表的子查询,在下层嵌套再次找到子查询抛错
子查询不支持聚合函数,不支持含shema的SQL:shardingsphere对sql的访问都是在同一个逻辑schema上
完全支持MySQL、PostgreSQL和Oracle的分页查询,SQLServer由于分页查询较为复杂,仅部分支持
编译量过大的分页导致获取数据性能下降
优化
优化实例
LIMIT不能通过索引查询数据,通过连续性ID分页,或上次查询结果最后一条
SELECT * FROM t_order WHERE id > 100000 AND id <= 100010 ORDER BY id
SELECT * FROM t_order WHERE id > 100000 LIMIT 10
分页子查询
oracle,使用rownum分页
SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT o.order_id as order_id FROM t_order o JOIN t_order_item i ON o.order_id = i.order_id) row_ WHERE rownum <= ?) WHERE rownum > ?
sqlserver,TOP + ROW_NUMBER() OVER
SELECT * FROM (SELECT TOP (?) ROW_NUMBER() OVER (ORDER BY o.order_id DESC) AS rownum, * FROM t_order o) AS temp WHERE temp.rownum > ? ORDER BY temp.order_id
SQL service 2012后的offset fetch
SELECT * FROM t_order o ORDER BY id OFFSET ? ROW FETCH NEXT ? ROWS ONLY
https://www.yiibai.com/sqlserver/sql-server-offset-fetch.html
不支持Wtih *** as (select ……)分页:hibernate自动分页语句使用了,所以不支持基于hibernate的sqlservice 分页
不支持两个top+子查询的分页方式
配置中使用${expression}或$—>{expression}标识
目前支持数据节点和分片算法的配置
多个${expression} $—>{expression},结果据每个子表达式结果笛卡尔组合
分片规则配置每个表主键生成策略,默认使用雪花算法生成64bit长整型数据
不同进程主键不重复,同一进程主键有序
同进程中,通过时间位:不重复,时间同序通列位保证不重复
主键:1bit符号位,41bit时间戳位,10bit工作进程位,12bit序列号位
符号位:预留符号位恒为0
时间戳位:毫秒数:2的41次幂,一年所使用毫秒数 365*24*60*60*1000约等于69.73年,始于2016/11/1/00:00:00
工作进程:java进程内唯一,分布式应用部署应保证每个进程id不同,该值默认为0可设置属性
序列号位:同一毫秒内生成不同ID,如该毫秒生超过4096(2的12次幂),生成器等待下一毫秒
将导致重复序列,默认分布式主键生成器提供了一个最大容忍的时钟回拨毫秒数:默认0,设置属性
超过,报错
范围内,默认会等待时钟同步到最后一次主键生成的时间后再继续工作
leaf_segment和leaf_snowflake两种方案,目前shardingsphere已实现leaf_segment
解析sql提取分片键列与值 进行分片,若无分片条件 无法分片 需全路由
使用threadlocal管理分片键值,通编程方式向hintmanager添加分片条件,仅当前线程有效
还计划通过sql中特殊注释引用hint,开发者透明方式使用该功能
指定强制分片路由sql无视原有分片逻辑,直接路由至指定真实数据节点
据sql语义分析,读写路由至主从库
主库:增删改操作使用的库,仅支持单主库
从库:查数据操作所使用的库,多从库
主从同步:主库数据异步的同步到从库,由于主从同步的异步性,主从数据短时间内不一致
一主多从读写分离配置,可独立使用,可配合分库分表使用
独立使用读写分离支持sql透传
基于hint强制主库路由
同一线程且同一库连接内,如有写入,以后读均从主库取
主从数据同步,主从同步延迟导致数据不一致,主库双写或多写
配置中心在定义的命名空间的config下,以yaml格式存:数据源 数据分片 读写分离 properties配置
config
├──authentication # Sharding-Proxy权限配置
├──props # 属性配置
├──schema # Schema配置
├ ├──sharding_db # SchemaName配置
├ ├ ├──datasource # 数据源配置
├ ├ ├──rule # 数据分片规则配置
├ ├──masterslave_db # SchemaName配置
├ ├ ├──datasource # 数据源配置
├ ├ ├──rule # 读写分离规则
https://shardingsphere.apache.org/document/current/cn/features/orchestration/config-center/ !!!
通注册中心,提供熔断数据库访问程序对数据库访问和禁用从库访问
在命名空间的state下,创建数据库访问对象运行节点,区分不同数据库访问实例:instances 和 datasources
state/instances:数据库访问对象运行实例信息,子节点:当前运行实例标识
标识由 服务器IP和PID构成,临时节点 实例上线时注册下线时清理
注册中心监控节点变化治理运行中实例对数据库的访问
state/datasources:治理读写分离从库,动态添加 删除 禁用
在IP@-@PID节点写入disabled(忽略大小写):禁用该实例 删除disabled:启用
读写分离(数据分片+读写分离)可在数据源名称子节点中写入disabled:禁用从库数据源,删除disabled或节点:启用
SPI:service provider interface 为被第三方实现或扩展的api:实现框架扩展或组件替换
官方使用apache curator(zk的java/jvm客户端)做为zk实现方案
官方使用原生etcd做为etcd实现方案
APM:着眼于分布式系统性能诊断,调用链展示,应用拓扑分析
shardingsphere将sql解析与执行的数据分片最核心的相关信息发送至应用性能监控系统