Lindorm SQL与MySQL的兼容性对比

本文主要介绍 Lindorm SQL 与原生 MySQL 数据库的兼容性对比信息。

Lindorm SQL 兼容 MySQL 5.7/8.0 的部分功能和语法,由于产品架构不同,部分语法或功能并没有被完全支持。本文主要从以下方面介绍 Lindorm SQL 与原生 MySQL 数据库的区别:

词法要素

  • 大小写敏感规则

    Lindorm SQL 中数据库对象标识符严格区分大小写,唯一例外是系统库 information_schema 及其下的系统视图。

  • 标识符引用要求

    Lindorm SQL 中数据库对象的标识符必须用反引号 ` 进行引用,以确保正确解析和引用。

  • 字符串常量格式

    Lindorm SQL 中的字符串常量只能用单引号 ' 定义,不支持像 MySQL 那样的双引号引用方式。

  • 关键字差异

    Lindorm SQL 的保留关键字和非保留关键字列表与 MySQL 不同,具体差异可参考文档关键字

数据类型

Lindorm 目前不支持以下类型:

  • BIT 类型

  • MEDIUMINT类型

  • REAL类型

  • 各种 TEXT 类型

  • DATETIME类型

  • 除 BIGINT UNSIGNED 以外的 UNSIGNED 类型

说明
  • Lindorm 的已支持类型中,对于 TINYINT、INTEGER、BIGINT 等整型类型,不支持指定具体的长度限制。

  • 对于 VARCHAR 类型可以不指定长度限制,但最终会受到一个全局的 VARCHAR 类型长度限制(默认 2MB,可配置)。

数据库事务

Lindorm 不支持多行事务(即一次读写多行数据的事务性)。

字符集与字符序

  • Lindorm 的字符串只支持 Unicode 字符集(UTF-8 编码)。

  • Lindorm 支持的字符序仅为 utf8_as_cs(大小写敏感,重音敏感)。

SQL 语法

SELECT

支持大部分查询功能,包括单表查询、子查询,支持分组、聚合、排序等常见算子。

  • 不支持多表连接查询、以及查询结果集的 UNIONUNION ALLMINUSEXCEPT 或 INTERSECT 等集合操作。可通过计算引擎进行查询能力增强。

  • 子查询目前仅支持作为查询的派生表(Derived table),其他形式的子查询语法并不会报错,但执行可能会带来性能或稳定性的风险。

  • 窗口函数目前暂不支持。若在查询中指定语法并不会报错,但执行可能会带来正确性或稳定性的风险。

  • 对于查询中指定的过滤条件不满足主键的最左主键匹配原则,或者过滤条件无法命中任何索引时,这样的查询会被视作“低效查询”,默认无法执行。可参见FAQ 如何解决或规避低效查询问题?

  • 对于查询中包含排序、聚合等需要在内存中积攒结果集进行计算的算子,Lindorm SQL 的每个查询存在一个工作内存上限(默认 8MB,可配置),查询中积攒内存超限时查询会失败。可参见 FAQ 执行SQL查询时,为什么会报错The estimated memory used by the query exceeds the maximum limit?

UPSERT/INSERT

Lindorm SQL 的 INSERT 本质是 UPSERT,对于主键相同的数据会直接覆盖写入语句中涉及到的字段/列。

说明

传统数据库中基于全主键的等值过滤条件进行UPDATE 的语句建议改成使用 INSERT 语句,来取得更好的性能。

  • Lindorm SQL 的 INSERT 语句需要写入语句中显式指定待写入的表的字段列表,且字段列表中必须至少指定一个非主键列。

  • Lindorm 的 INSERT 语句支持 ON DUPLICATE KEY 语法,其中可指定的谓词包括 UPDATE / IGNORE / ERROR 。但这样的ON DUPLICATE KEY 写入语句性能相较普通 INSERT 会劣化很多。

  • 支持 INSERT INTO ... SELECT 语法,但在 INSERT INTO ... SELECT 语句中不支持指定ON DUPLICATE KEY 语法。

DELETE

Lindorm SQL 的 DELETE 语句必须指定 WHERE 条件,且需要 WHERE 过滤条件能够明确指定所有主键的等值条件精确定位到一条数据。

说明

如果 WHERE 过滤条件可以定位到一批数据,这样的 DELETE 语句默认无法执行。若实际业务场景需要批量删除,可联系Lindorm技术支持(钉钉号:s0s3eg3)配置系统参数启用批量删除能力。

  • 不支持指定 ORDER BY 子句。

  • 批量删除时,操作的原子性无法保证。

  • 批量删除时是先查后删,请尽可能保证 WHERE 条件能够高效命中索引。

  • 大量删除操作会影响某些查询场景的性能。可以设置 TTL 的情况下,优先建议通过 TTL 让数据过期。

UPDATE

Lindorm SQL 的 UPDATE 语句必须指定 WHERE 条件,且需要 WHERE 过滤条件能够明确指定所有主键的等值条件精确定位到一条数据。

说明

如果 WHERE 过滤条件可以定位到一批数据,这样的 UPDATE 语句默认无法执行。若实际业务场景需要批量更新,可联系Lindorm技术支持(钉钉号:s0s3eg3)配置系统参数启用批量更新能力。

  • UPDATE 的值只支持比较简单的字面常量,不支持复杂的函数等表达式。

  • 不支持指定 ORDER BY 子句。

  • 不支持指定 LIMIT 子句。

  • 不支持更新 PRIMARY KEY 字段。

  • 批量更新时,操作的原子性无法保证。

  • 批量更新时是先查后更新,最好保证 WHERE 条件能够高效命中索引。

CREATE TABLE

Lindorm SQL 创建的表只能用 SQL 进行读写;另一方面,对于使用 HBase API 创建的表虽然不能使用 SQL 进行写入操作,但是可以通过 SQL 进行查询。可参见文档 使用SQL访问HBase

  • 支持创建不含任何主键的表,但建出的表事实上会自带一个以 UUID 作为值的列作为主键,您可联系Lindorm技术支持(钉钉号:s0s3eg3)启用创建无主键表的能力。

  • 支持 DEFAULT 子句。但 DEFAULT 子句中指定的默认值仅是列类型的常量表达式或非常有限的无参函数(如 NOW())。

  • 不支持创建只含主键的表。

  • 不支持 FOREIGN KEY。

  • 不支持自增字段(AUTO_INCREMENT)。

  • 不支持 PARTITION 子句。

ALTER TABLE

  • 支持加列和删列,但不支持重命名列。

  • 不支持修改列定义,包括列类型、精度、修改或者增加默认值等。

  • 不支持通过 ALTER TABLE 语句增减索引。

  • 不支持修改表的主键,包括增加主键列和减少主键列或者调整主键顺序。

DROP TABLE

  • Lindorm SQL 的 DROP TABLE 语句默认会把与表关联的索引等对象全部删除。

CREATE INDEX

Lindorm 中可通过 CREATE INDEX 语句为表创建二级索引、时空索引、搜索索引以及列存索引。

  • 不支持创建唯一索引(UNIQUE INDEX)。

  • 不支持指定 ALGORITHM / LOCK 表达式。

  • 使用 CREATE INDEX 创建二级索引时,可以通过指定 INCLUDE 子句指定冗余列,以获得索引命中时更好的查询性能。可参见文档冗余列(include_expression)

  • 支持使用函数表达式作为索引键,但具体支持的函数表达式因索引类型不同而不同,需结合具体场景创建。

ALTER INDEX

  • 支持通过 ALTER INDEX 语句给搜索索引增减索引列,但增减后需要重新构建索引。

  • 二级索引不支持通过 ALTER INDEX 增加列或者删除列。

DROP INDEX

  • 不支持指定 ALGORITHM / LOCK 表达式。

系统视图

Lindorm SQL 支持了标准 information_schema 中的一部分系统视图,具体的支持情况如下:

视图名

支持情况

TABLES

可以获取以下列信息:

  • TABLE_CATALOG(固定为def

  • TABLE_SCHEMA

  • TABLE_NAME

  • TABLE_TYPE

  • ENGINE

  • ROW_FORMAT

  • TABLE_COLLATION

COLUMNS

可以获取以下列信息:

  • TABLE_CATALOG(固定为def

  • TABLE_SCHEMA

  • TABLE_NAME

  • COLUMN_NAME

  • ORDINAL_POSITION

  • IS_NULLABLE

  • DATA_TYPE

  • CHARACTER_MAXIMUM_LENGTH(实际上与CHARACTER_OCTET_LENGTH 是相同值)

  • CHARACTER_OCTET_LENGTH

  • NUMERIC_PRECISION

  • NUMERIC_SCALE

  • COLUMN_TYPE

  • COLUMN_KEY

SCHEMATA

可以获取以下列信息:

  • CATALOG_NAME(固定为def

  • SCHEMA_NAME

  • DEFAULT_CHARACTER_SET_NAME

  • DEFAULT_COLLATION_NAME

  • DEFAULT_ENCRYPTION

TABLE_CONSTRAINTS

可以获取以下列信息:

  • CONSTRAINT_CATALOG(固定为def

  • CONSTRAINT_SCHEMA

  • CONSTRAINT_NAME

  • TABLE_SCHEMA

  • TABLE_NAME

  • PK_CONSTRAINT_TYPE

  • ENFORCED

KEY_COLUMN_USAGE

可以获取以下列信息:

  • CONSTRAINT_CATALOG(固定为def

  • CONSTRAINT_SCHEMA

  • CONSTRAINT_NAME

  • TABLE_CATALOG(固定为def

  • TABLE_SCHEMA

  • TABLE_NAME

  • COLUMN_NAME

  • ORDINAL_POSITION

USER_PRIVILEGES

可以获取以下列信息:

  • GRANTEE

  • TABLE_CATALOG(固定为def

  • PRIVILEGE_TYPE

  • IS_GRANTABLE

SCHEMA_PRIVILEGES

可以获取以下列信息:

  • GRANTEE

  • TABLE_CATALOG(固定为def

  • TABLE_SCHEMA

  • PRIVILEGE_TYPE

  • IS_GRANTABLE

TABLE_PRIVILEGES

可以获取以下列信息:

  • GRANTEE

  • TABLE_CATALOG(固定为def

  • TABLE_SCHEMA

  • TABLE_NAME

  • PRIVILEGE_TYPE

  • IS_GRANTABLE

KEYWORDS

可以获取以下列信息:

  • WORD

  • RESERVED

函数与表达式

  • 支持的内置函数在持续迭代增加中,已支持的函数可参见函数说明

  • 不支持用户自定义函数(UDF)。

  • 不支持 CTE 表达式。若在语句中指定 CTE 表达式并不会报错,但执行可能会带来性能或稳定性的风险。

  • Lindorm SQL 支持流程控制表达式(CASE 表达式、IF()表达式、IFNULL()表达式),但这类表达式仅支持在 SQL 引擎中计算,不支持计算下推至存储引擎。

不支持的语法功能

  • 不支持 RENAME TABLE 语法。

  • 不支持 REPLACE 语法。

  • 不支持 SELECT ... FOR SHARE ... 语法。

  • 不支持显式事务相关语法 ( START TRANSACTION, COMMIT, ROLLBACK等)。

  • 不支持CREATE TABLE AS SELECT语法。

  • 不支持表的导入/导出语法(IMPORTLOAD)。

  • 不支持 EXPLAIN ANALYZE 语法。

  • 不支持表的运维语法(ANALYZE TABLE, OPTIMIZE TABLE,CHECK TABLEREPAIR TABLE )。

  • 不支持以下数据库对象:

    • 临时表(Temporary Table)

    • 视图(View)

    • 存储过程(Procedure)

    • 触发器(Trigger)

    • 事件(Event)

    • 约束(Constraitnt)