支持的mysql 版本
- 5.6-8.0,但是5.6 从2021年2月不更新了,所以建议5.7之后版本
事务隔离级别
- vitess: read committed
- mysql default: pepeatable read
SQL语法
https://github.com/vitessio/vitess/blob/main/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt
DDL
- vtctlclient: vitess有封装,使用vtctlclient ApplySchema -sql 可以执行DDL,会自动应用到各个shard上,还会做一些检查,比如表比较大会决绝此DDL,保护用户访问
- VGate: 直接通过SQL语句也可以操作,不建议这样修改大表
- 直连mysql做DDL:VTablet 最终会注意到变化并自行更新。这由默认为 1800 秒的 -queryserver-config-schema-reload-time 参数控制。还可以明确发出 vtctlclient ReloadSchema 命令以使其立即重新加载
- online DDL: vitess集成了onlineDDL工具,直接封装到命令里了,有两种途径做online DDL
- https://vitess.io/docs/user-guides/schema-changes/managed-online-schema-changes/
- VGate:连接到VGate后就像连接掉mysql一样,通过执行SQL,set @@ddl_strategy=‘direct/online/gh-ost/pt-osc’ 通过不同的工具执行表结构变更
- 通过vtctl: vtctlclient ApplySchema -ddl_strategy “direct/online/gh-ost/pt-osc” -sql ‘ALTER TABLE demo MODIFY id bigint UNSIGNED’ xxx
- 几种策略
- https://vitess.io/docs/user-guides/schema-changes/ddl-strategies/
- online: utilizes Vitess’s built in VReplication mechanism.
- gh-ost: uses 3rd party GitHub’s gh-ost tool.
- pt-osc: uses 3rd party Percona’s pt-online-schema-change as part of Percona Toolkit
join
- Vitess 支持 INNER JOIN 包括跨分片join
- 只要不存在将外部表上的列与分片键空间中的内部表进行比较的表达式,就支持 LEFT JOIN
order
- Vitess 支持对所有列进行排序,而不管数据类型如何
group by
- Vitess 支持 GROUP BY 操作的子集,包括跨分片操作
- VTGate 服务器能够进行分散-聚集操作,但只能流式传输结果。 因此,如果中间结果集大于 VTGate 的内存限制,则执行 GROUP BY colx ORDER BY coly 的查询可能会被拒绝。
子查询
- Vitess 支持子查询的子集。例如,不支持结合 GROUP BY 操作的子查询
存储过程
- 仅支持使用 CALL 调用存储过程
- 使用call调用存储过程还有相关限制
- 如果使用事务,则存储过程不能更改事务状态。
- 不能返回结果
- 只支持in参数
- 不支持创建存储过程
不支持kill
跨分片事务
- 默认情况下,Vitess 不支持跨分片的事务。
- 虽然 Vitess 可以通过使用两阶段提交来支持这一点,但通常建议以不需要跨分片修改的方式设计 VSchema
不支持窗口函数和CTEs
OLAP workload
默认情况下,Vitess 对查询可以返回的执行时间和行数设置了一些有意的限制。 这种默认工作负载模式称为 OLTP。 这可以通过将工作负载设置为 OLAP 来禁用
SELECT … INTO
- 只支持SELECT … INTO DUMFILE and SELECT … INTO OUTFILE
- 只能用于未shard的表
- shard的表必须使用use xxx来指定分片后使用
LOAD DATA
- 只能用于未shard的表
- shard的表必须使用use xxx来指定分片后使用
临时表
- Vitess 对临时表的支持有限。它仅适用于未分片的键空间。
- 如果用户创建了一个临时表,那么会话将开始使用保留连接来处理在该会话上发送的任何查询。
- 此会话生成的查询计划将不会被缓存。它仍然会继续使用从其他非临时表会话缓存的查询计划
字符集
SQL mode
Vitess 的行为类似于 STRICT_TRANS_TABLES sql 模式,不建议更改 SQL 模式设置
数据类型
Vitess 支持 MySQL 中所有可用的数据类型。强烈建议不要使用 FLOAT 数据类型作为 PRIMARY KEY 的一部分,因为过滤复制和 VReplication 等功能将无法正确检测哪些行应作为修改的一部分包含在内
自增主键
- 分片键空间中的表不支持 auto_increment 列属性,因为生成的值仅对每个分片是本地的。
- Vitess Sequences 与 auto_increment功能相近
- vitess sequences类似个未分片的表,创建后可以与用户表中的某列关联,这样每次新增都会自增,详见以上链接中
use语句
- Vitess 允许您使用 MySQL USE 语句和客户端库使用的相应二进制 API 来选择键空间。
- SQL 语句可以使用标准点表示法引用另一个键空间中的表 select * from a.table
- Vitess 还可以在USE 语句中选择特定的分片和tablet-type USE
mykeyspace:-80@rdonly
CREATE/DROP DATABASE
- Vitess 不支持开箱即用的 CREATE 和 DROP DATABASE 查询, 但是,为了能够提供数据库,存在插件机制。该插件必须负责创建和删除数据库,并更新拓扑。
- 该插件应实现DBDDLPlugin接口,并保存到go/vt/vtgate/engine/目录下的新文件中
- 然后它必须调用 DBDDLRegister 注册自己。 您可以查看引擎包中的 dbddl_plugin.go 以了解它是如何完成的。 最后,您需要向 vtgate 添加一个命令行标志以使其使用新插件:-dbddl_plugin=myPluginName
翻译自:https://vitess.io/docs/reference/compatibility/mysql-compatibility/