SQL兼容性简介

Mycat虽然使用MySQL网络通信协议实现与客户端的通信,但是SQL执行引擎实现技术与MySQL完全不相同.而且Mycat后端数据存储节点也未必是MySQL数据库,所以会有一些限制.

Explain语句

Mycat2支持Explain语句,仅支持select,delete,insert,update语句。
其他语法也一定程度上支持explain语句,但是不在实现目标之内,可能存在不能运行的情况。
语法

  1. explain statement

结果

  1. plan
  2. sql:
  3. SELECT *
  4. FROM db1.`travelrecord`
  5. rel:
  6. View(
  7. relNode=[SELECT *
  8. FROM `db1`.`travelrecord`],
  9. distribution=[
  10. {targetName='c0', schemaName='db1_0',tableName='travelrecord_0'},
  11. {targetName='c0', schemaName='db1_0',tableName='travelrecord_1'},
  12. ...])

一般来说包含三个方面信息
1.Mycat接收到的sql
2.下推的关系表达式以及最终执行的sql模板
3.一个或多个存储节点的信息

不支持的SQL高级功能

不支持UDF
不支持自定义数据类型
不支持外键
不支持Mycat运算的逻辑视图
不支持游标
不支持触发器
不支持Mycat运算的存储过程
不支持流程控制语句

不支持的DML

不支持一条SQL多表插入,删除,更新
不支持子查询内使用for update
语法顶层的for update语句在非读写分离的功能上(即涉及分布式查询)会把涉及的每个存储节点的sql加上for update.
插入,删除,更新SQL中使用子查询不能运算跨分片的数据
不支持 STRAIGHT_JOIN 和 NATURAL JOIN
不支持MySQL注解
不支持跨分片删除,更新使用order by/limit语法
不支持INSERT INTO … SELECT … FROM 语法
不支持loaddata
不支持跨分片UPDATE DELETE有JOIN语法
不支持SELECT INTO OUTFILE/INTO DUMPFILE/INTO
兼容支持SQL中对变量读写,但是没有副作用

不支持的DDL

所有DDL都不支持多表操作,只支持单表操作
所有DDL都不支持多库操作,只支持单库操作

不支持函数

不支持GTID函数
不支持全文检索函数
不支持企业加密函数
不支持row_count函数

不支持的数据类型

不支持空间数据类型
JSON,XML类型需要使用字符串类型表示