SQL
本文详细罗列出已明确可支持的SQL种类以及已明确不支持的SQL种类,尽量让使用者避免踩坑。
其中必然有未涉及到的SQL欢迎补充,未支持的SQL也尽量会在未来的版本中支持。
- 100%全兼容(目前仅MySQL,其他数据库完善中)。
路由至多数据节点
全面支持DML、DDL、DCL、TCL和部分DAL。支持分页、去重、排序、分组、聚合、关联查询(不支持跨库关联)。以下用最为复杂的DML举例:
- SELECT主语句
- select_expr
[DISTINCT] COLUMN_NAME [AS] [alias] |
COUNT(* | COLUMN_NAME | alias) [AS] [alias]
- table_reference
不支持CASE WHEN、HAVING、UNION (ALL),有限支持子查询。
例如,以下子查询可以支持:
以下子查询不支持:
简单来说,通过子查询进行非功能需求,在大部分情况下是可以支持的。比如分页、统计总数等;而通过子查询实现业务查询当前并不能支持。
由于归并的限制,子查询中包含聚合函数目前无法支持。
对分片键进行操作
运算表达式和函数中的分片键会导致全路由。
假设create_time
为分片键,则无法精确路由形如SQL:
由于ShardingSphere只能通过SQL字面
提取用于分片的值,因此当分片键处于运算表达式或函数中时,ShardingSphere无法提前获取分片键位于数据库中的值,从而无法计算出真正的分片值。
当出现此类分片键处于运算表达式或函数中的SQL时,ShardingSphere将采用全路由的形式获取结果。