跳到主要内容

MySQL 兼容性

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

seekdb 兼容 MySQL 5.7/8.0 的绝大部分功能和语法。由于产品架构不同,或者客户需求不大,有些功能并没有被支持。本节主要从以下几方面介绍 seekdb 与原生 MySQL 数据库的不同:

  • 数据类型

  • SQL 语法

  • 过程性语言

  • 系统视图

  • 字符集

  • 字符序

  • 函数与表达式

  • 分区支持

  • 存储引擎

  • 优化器

数据类型

seekdb 支持的数据类型有:

  • 数值类型

    • 整数类型:BOOL/BOOLEAN/TINYINTSMALLINTMEDIUMINTINT/INTEGERBIGINT

    • 定点类型:DECIMALNUMERIC

    • 浮点类型:FLOATDOUBLE

    • Bit-Value 类型:BIT

  • 日期时间类型:DATETIMETIMESTAMPDATETIMEYEAR

  • 字符类型:CHARVARCHARBINARYVARBINARY

  • 大对象类型:TINYBLOBBLOBMEDIUMBLOBLONGBLOB

  • 文本类型:TINYTEXTTEXTMEDIUMTEXTLONGTEXTSTRING

  • 枚举类型:ENUM

  • 集合类型:SET

  • JSON 数据类型

  • 空间数据类型

  • 高效压缩位图数据类型

  • 数组数据类型

  • 向量数据类型

SQL 语法

tab 支持

SELECT

  • 支持大部分查询功能,包括支持单、多表查询;支持子查询;支持内联接、半联接以及外联接;支持分组、聚合;支持常见的概率、线性回归等数据挖掘函数等。

  • 支持对多个 SELECT 查询的结果进行 UNIONUNION ALLMINUSEXCEPTINTERSECT 等集合操作。

  • 支持使用 EXPLAIN 语法查看执行计划。

INSERT

  • 支持单行和多行插入数据,同时支持指定分区插入数据。

  • 支持 INSERT INTO ... SELECT ... 语句。

UPDATE

  • 支持单列和多列更新数据。

  • 支持使用子查询更新数据。

  • 支持集合更新数据。

DELETE

  • 支持单表和多表删除。

TRUNCATE

  • 支持完全清空指定表。

tab 不支持

SELECT

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

TRUNCATE

  • 不支持在进行事务处理和表锁定的过程中操作。

过程性语言

seekdb 兼容了大部分 MySQL 数据库的 PL 功能,主要支持的 PL 功能如下:

  • 数据类型
  • 存储过程
  • 自定义函数
  • 触发器
  • 异常处理

此外,seekdb 特有的 MySQL PL 系统包,包括 DBMS_RESOURCE_MANAGERDBMS_STATSDBMS_UDRDBMS_XPLANDBMS_WORKLOAD_REPOSITORY 等。

更多 PL 功能的详细信息,请参见 PL 参考

系统视图

seekdb 实现了 information_schemamysql 这两个内部数据库中的大部分视图,但是由于架构不同,seekdb 并不保证所有视图均能实现以及视图中所有的列含义与 MySQL 相同。

更多系统视图的说明信息请参考《参考指南》文档中 系统视图 章节。

字符集

seekdb 支持的字符集如下:

  • binary

  • utf8mb4/utf8mb3

    信息

    utf8mb3utf8mb4 的别名。

  • gbk

  • utf16

  • utf16le

  • gb18030

  • latin1

  • gb18030_2022

  • ascii

  • tis620

  • sjis

  • big5

  • dec8

  • gb2312

  • ujis

  • euckr

  • eucjpms

  • cp932

  • cp850

  • hp8

  • macroman

  • swe7

字符序

seekdb 支持的字符序如下表所示。

字符序所属字符集说明
utf8mb4_general_ciutf8mb4使用通用排序规则。
utf8mb4_binutf8mb4使用二进制排序规则。
utf8mb4_unicode_ciutf8mb4使用基于 Unicode Collation Algorithm (UCA) 的排序规则。
utf8mb4_unicode_520_ciutf8mb4使用 Unicode 5.2.0 版本的排序规则。它遵循 Unicode 码点排序,并忽略字符的大小写差异。
utf8mb4_croatian_ciutf8mb4使用克罗地亚文(Croatian)的排序规则。utf8mb4_croatian_ci 兼容 utf8_croatian_ci
utf8mb4_czech_ciutf8mb4使用捷克文(Czech)的排序规则。
utf8mb4_0900_ai_ciutf8mb4使用 Unicode 9.0.0 版本的字符排序规则和顺序,同时忽略了字符的大小写差异,将大写字母和小写字母视为相同的字符。
binarybinary使用二进制排序规则。
gbk_chinese_cigbk使用中文语言排序规则。
gbk_bingbk使用二进制排序规则。
utf16_general_ciutf16使用通用排序规则。
utf16_binutf16使用二进制排序规则。
utf16_unicode_ciutf16使用基于 Unicode Collation Algorithm (UCA) 的排序规则。
utf8mb4_german2_ciutf16le使用德语排序规则。
utf8mb4_croatian_ciutf16le使用克罗地亚语排序规则。
gb18030_chinese_cigb18030使用中文语言排序规则。
gb18030_bingb18030使用二进制排序规则。
latin1_swedish_cilatin1使用瑞典语/芬兰语排序规则。
latin1_german1_cilatin1用于德国(German)语言环境下的 latin1 字符集的排序规则。
latin1_danish_cilatin1用于丹麦(Danish)语言环境下的 latin1 字符集的排序规则。
latin1_german2_cilatin1用于德语环境,适用于需要按照字典顺序进行字符比较的应用场景。
latin1_general_cilatin1用于需要不区分大小写且支持重音符号的场景,如某些欧洲语言的数据库设计。
latin1_general_cslatin1用于区分大小写的通用排序规则,支持多种语言(如西欧语言)。
latin1_spanish_cilatin1用于西班牙(Spanish)语言环境的排序规则。
latin1_binlatin1latin1 使用二进制排序规则。
gb18030_2022_bingb18030_2022使用二进制排序规则。
gb18030_2022_chinese_cigb18030_2022使用拼音排序规则。不区分大小写。该字符集的默认字符序。
gb18030_2022_chinese_csgb18030_2022使用拼音排序规则。区分大小写。
gb18030_2022_radical_cigb18030_2022使用部首笔画排序规则。不区分大小写。
gb18030_2022_radical_csgb18030_2022使用部首笔画排序规则。区分大小写。
gb18030_2022_stroke_cigb18030_2022使用笔画排序规则。不区分大小写。
gb18030_2022_stroke_csgb18030_2022使用笔画排序规则。区分大小写。
ascii_binascii使用二进制排序规则。
ascii_general_ciascii使用基于字母的不区分大小写的排序规则。它忽略了字符的大小写差异,将大写字母和小写字母视为相同的字符。
tis620_bintis620使用二进制排序规则。
tis620_thai_citis620使用泰语排序规则,不区分大小写。
sjis_japanese_cisjis使用日语排序规则。
dec8_swedish_cidec8使用瑞典语排序规则。
gb2312_chinese_cigb2312使用 GB2312 字符集,按照中文排序规则进行不区分大小写的排序。
gb2312_bingb2312使用 GB2312 字符集,按照二进制顺序进行区分大小写的排序。
ujis_japanese_ciujis使用 UJIS 字符集,按照日语排序规则进行不区分大小写的排序。
ujis_binujis使用 UJIS 字符集,按照二进制顺序进行区分大小写的排序。
euckr_korean_cieuckr使用 EUCKR 字符集,按照韩语排序规则进行不区分大小写的排序。
euckr_bineuckr使用 EUCKR 字符集,按照二进制顺序进行区分大小写的排序。
eucjpms_japanese_cieucjpms使用 EUCJPMS 字符集,按照日语排序规则进行不区分大小写的排序。
eucjpms_bineucjpms使用 EUCJPMS 字符集,按照二进制顺序进行区分大小写的排序。
cp932_japanese_cicp932使用 CP932 字符集,按照日语排序规则进行不区分大小写的排序。
cp932_bincp932使用 CP932 字符集,按照二进制顺序进行区分大小写的排序。
cp850_general_cicp850使用 CP850 字符集,按照通用排序规则进行不区分大小写的排序。
cp850_bincp850使用 CP850 字符集,按照二进制顺序进行区分大小写的排序。
hp8_english_cihp8使用 HP8 字符集,按照英语排序规则进行不区分大小写的排序。
hp8_binhp8使用 HP8 字符集,按照二进制顺序进行区分大小写的排序。
macroman_general_cimacroman使用 MacRoman 字符集,按照通用排序规则进行不区分大小写的排序。
macroman_binmacroman使用 MacRoman 字符集,按照二进制顺序进行区分大小写的排序。
swe7_swedish_ciswe7使用 SWE7 字符集,按照瑞典语排序规则进行不区分大小写的排序。
swe7_binswe7使用 SWE7 字符集,按照二进制顺序进行区分大小写的排序。

函数

tab 支持

seekdb 所支持的分析(窗口)函数是 MySQL 数据库的超集,即 MySQL 数据库的分析(窗口)函数 seekdb 都支持。

tab 不支持

与 MySQL 数据库对比,seekdb 不支持如下函数:

  • 字符串函数:LOAD_FILE()MATCH()

  • XML 函数:ExtractValue()UpdateXML()

  • 其他函数:MASTER_POS_WAIT()

分区支持

seekdb 与 MySQL 数据库对分区的支持差异如下:

  • seekdb 支持一级分区,模板化和非模板化二级分区;MySQL 数据库不支持非模板化二级分区。

  • seekdb 的二级分区支持 Hash、Key、Range、Range Columns、List 和 List Columns 分区;MySQL 数据库的二级分区仅支持 Hash 分区和 Key 分区。

  • seekdb 的二级分区表支持添加和删除二级分区;MySQL 数据库不支持添加和删除二级分区。

    提示

    不支持二级分区类型是 Hash 或 Key 类型的场景新增和删除二级分区。

更多分区的说明及使用,请参见 分区概述

存储引擎

与 MySQL 数据库基于数据块的 InnoDB 和 Myisam 引擎不同,seekdb 使用的是基于 LSM-Tree 架构的存储引擎。

优化器

seekdb 兼容了部分 MySQL 数据库的优化器功能。有关优化器的详细信息,请参见 SQL 调优指南

tab 支持

  • 查看执行计划的命令

    • 输出的列信息仅包含 IDOPERATORNAMEEST. ROWSCOST 以及算子的详细信息。
  • 查看统计信息

    • 支持执行 ANALYZE TABLE 语句手动查询数据字典表存储有关列值的直方图统计信息。

    • 支持通过视图自动查看表统计信息和列统计信息。

  • 查询改写优化

    • 支持外联接优化。

    • 支持外联接简化。

    • 支持块嵌套循环和批量 Key 访问联接。

    • 支持条件过滤。

    • 支持常量叠算优化。

    • 支持 IS NULL 优化 (索引不存储 NULL 值)。

    • 支持 ORDER BY 优化。

    • 支持 GROUP BY 优化。

    • 支持 DISTINCT 消除。

    • 支持 LIMIT 下压。

    • 支持 Window 函数优化。

    • 支持避免全表扫描。

    • 支持谓词下压。

  • Optimizer Hint 机制

    • 支持联接顺序 Optimizer Hints。

    • 支持表级别的 Optimizer Hints。

    • 支持索引级别的 Optimizer Hints。

    • 语法支持 INDEX Hint、FULL Hint、ORDERED Hint 和 LEADING Hint 等。

  • 兼容 MySQL 数据库的并行执行能力包括并行查询、并行复制和并行写入等,且 seekdb 已经支持并行算子,包括并行聚集、并行联接、并行分组以及并行排序等。

  • seekdb 还支持计划缓存和预编译,MySQL 数据库并不支持。

tab 不支持

  • 查看执行计划的命令

    • 不支持使用 SHOW WARNINGS 显示额外的信息。