Mycat1.6 SQL支持
1. DDL 语句
| 语句 | 支持状态 | 说明 |
| CREATE TABLE | 支持 | 需要手动在每个分片节点执行 |
| ALTER TABLE | 支持 | 需要手动在每个分片节点执行 |
| DROP TABLE | 支持 | 需要手动在每个分片节点执行 |
| CREATE INDEX | 支持 | 需要手动在每个分片节点执行 |
| TRUNCATE TABLE | 支持 | 通过ER关系支持 |
2. DML 语句
| 语句 | 支持状态 | 说明 |
| INSERT | 支持 | 根据分片键路由到对应节点 |
| INSERT 批量 | 支持 | 自动拆分到各个节点 |
| UPDATE | 支持 | 带分片键可精确路由 |
| DELETE | 支持 | 带分片键可精确路由 |
| SELECT | 支持 | 支持跨分片查询,自动合并结果 |
3. SELECT 细化支持
| 特性 | 支持状态 |
| WHERE 条件 | 支持 |
| ORDER BY | 支持(内存排序) |
| GROUP BY | 支持 |
| HAVING | 支持 |
| LIMIT | 支持 |
| 分页 OFFSET | 支持(内存处理) |
| 聚合函数 COUNT/SUM/AVG/MAX/MIN | 支持 |
| DISTINCT | 支持 |
| 子查询(SELECT 中) | 部分支持 |
| INNER JOIN | 支持(不超过2表) |
| LEFT JOIN | 有限支持 |
| 表别名 ALIAS | 支持 |
| UNION / UNION ALL | 支持 |
4. 事务支持
# 支持的事务类型
# 1. Proxy 事务(默认)
-- 单节点事务,自动提交/回滚
BEGIN;
INSERT INTO ... ;
COMMIT;
# 2. XA 分布式事务
set autocommit=0;
set xa = on;
-- 支持跨节点的分布式事务
INSERT INTO db1.t1 VALUES(...);
INSERT INTO db2.t2 VALUES(...);
commit;
5. 跨分片查询
5.1 带分片键查询(最优)
-- 精确路由到单个节点
SELECT * FROM travelrecord WHERE id = 100;
5.2 不带分片键查询
-- 需要广播到所有节点,合并结果
SELECT * FROM travelrecord WHERE user_name = 'john';
-- 自动添加 LIMIT 100 (sqlMaxLimit)
5.3 分页查询注意事项
# 低效分页:
SELECT * FROM t WHERE ... LIMIT 100000,10;
# Mycat需从各节点取100010条,内存排序,性能较差
# 优化方案: 使用分片键范围 + 游标
SELECT * FROM t WHERE id > last_id LIMIT 10;
6. 不支持的SQL特性
| 特性 | 说明 |
| 存储过程 | 不支持跨分片存储过程 |
| 自定义函数(UDF) | 不支持 |
| 触发器 | 不支持 |
| 外键约束 | 不支持 |
| 视图 | 不支持 |
| 全文索引 | 不支持 |
| SAVEPOINT | 不支持 |
| 复杂的多表JOIN | 有限支持 |
重要: 跨分片查询应尽量避免大结果集。建议在应用层做好分页控制,避免Mycat内存溢出。
最佳实践: 业务SQL尽量带分片键条件,可以确保精确路由到单个节点,获得最优性能。