Doris与MySQL不兼容的特性

1,589 阅读9分钟

Doris 采用 MySQL 协议,高度兼容 MySQL 语法,支持标准 SQL,用户可以通过各类客户端工具来访问 Doris,并支持与 BI 工具的无缝对接。Doris 当前支持多种主流的 BI 产品,包括不限于 SmartBI、DataEase、FineBI、Tableau、Power BI、SuperSet 等,只要支持 MySQL 协议的 BI 工具,Doris 就可以作为数据源提供查询支持。

上述是Doris官方介绍的内容,Doris是高度兼容MySQL语法,支持标准SQL。实际上,官网说的很明白,高度兼容不是完全兼容,下面我就列举一些Doris与MySQL不兼容的语法或者特性。

数据类型

数字类型

类型MySQLDoris
Boolean
- 支持
- 关键字:Bool、Boolean
- 范围:0代表false,1代表true
- 大小:1bits

- 支持
- 关键字:Boolean
- 范围:0代表false,1代表true
- 大小:1bits
Bit
- 支持
- 范围:1 ~ 64
- 大小:1bits
不支持
Tinyint
- 支持
- 支持signed,unsigned
- 范围:
- signed: -128 ~ 127
- unsigned: 0 ~ 255
- 大小:1bits

- 支持
- 只支持signed
- 范围:-128 ~ 127
- 大小:1bits
Smallint
- 支持
- 支持signed,unsigned
- 范围:
- signed: -2^15 ~ 2^15-1
- unsigned: 0 ~ 2^16-1
- 大小:2bits

- 支持
- 只支持signed
- 范围:-32768 ~ 32767
- 大小:2bits
Mediumint
- 支持
- 支持signed,unsigned
- 范围:
- signed: -2^23 ~ 2^23-1
- unsigned: 0 ~ -2^24-1
- 大小:3bits

- 不支持
int
- 支持
- 支持signed,unsigned
- 范围:
- signed: -2^31 ~ 2^31-1
- unsigned: 0 ~ -2^32-1
- 大小:4bits
- 关键字:int/integer

- 支持
- 只支持signed
- 范围: -2147483648~ 2147483647
- 大小:4bits
- 关键字:int
Bigint
- 支持
- 支持signed,unsigned
- 范围:
- signed: -2^63 ~ 2^63-1
- unsigned: 0 ~ 2^64-1
- 大小:4bits
- 关键字:bigint

- 支持
- 只支持signed
- 范围: -2^63 ~ 2^63-1
- 大小:4bits
- 关键字:bigint
Largeint
- 不支持

- 支持
- 只支持signed
- 范围:-2^127 ~ 2^127-1
- 大小:4bits
- 关键字:Largeint
Decimal
- 支持
- 支持signed,unsigned(8.0.17以前支持,以后被标记为deprecated)
- 默认值:Decimal(10, 0)
- 关键字:Decimal/Dec

- 支持
- 只支持signed
- 默认值:Decimal(9, 0)
- 关键字:Decimal
Float/Double
- 支持
- 支持signed,unsigned(8.0.17以前支持,以后被标记为deprecated)
- 关键字:Float/Double
- 语法:Float(M,[D])/Double(M,[D])(8.0.17以前支持,以后被标记为deprecated)

- 支持
- 只支持signed
- 关键字:Float/Double

日期类型

类型MySQLDoris
Date
- 支持
- 范围:['1000-01-01','9999-12-31']
- 格式:YYYY-MM-DD

- 支持
- 范围:['0000-01-01', '9999-12-31']
- 格式:YYYY-MM-DD
DateTime
- 支持
- DATETIME([P]),可选参数P表示精度
- 范围:'1000-01-01 00:00:00.000000' ,'9999-12-31 23:59:59.999999'
- 格式:YYYY-MM-DD hh:mm:ss[.fraction]

- 支持
- DATETIME([P]),可选参数P表示精度
- 范围:['0000-01-01 00:00:00[.000000]', '9999-12-31 23:59:59[.999999]']
- 格式:YYYY-MM-DD hh:mm:ss[.fraction]
Timestamp
- 支持
- Timestamp[(p)],可选参数P表示精度
- 范围:['1970-01-01 00:00:01.000000' UTC , '2038-01-19 03:14:07.999999' UTC]
- 格式:YYYY-MM-DD hh:mm:ss[.fraction]

- 不支持
Time
- 支持
- Time[(p)]
- 范围:['-838:59:59.000000' to '838:59:59.000000']
- 格式:hh:mm:ss[.fraction]

- 不支持
Year
- 支持
- 范围:1901 to 2155, or 0000
- 格式:yyyy

- 不支持

字符串类型

类型MySQLDoris
Char
- 支持
- CHAR[(M),M为字符长度,缺省表示长度为1,
- 定长
- 范围:[0,255],字节大小

- 支持
- CHAR[(M),M为字节长度
- 可变
- 范围:[1,255]
Varchar
- 支持
- VARCHAR(M),M为字符长度
- 范围:[0,65535],字节大小

- 支持
- VARCHAR(M),M为字节长度。
- 范围:[1, 65533]
String
- 不支持

- 支持
- 1048576 字节(1MB),可调大到 2147483643 字节(2G)
- **be**里的参数**string_type_length_soft_limit_bytes**
Binary
- 支持
- 类似于Char

- 不支持
Varbinary
- 支持
- 类似于Varchar

- 不支持
Blob
- 支持
- TinyBlob、Blob、MediumBlob、LongBlob

- 不支持
Text
- 支持
- TinyText、Text、MediumText、LongText

- 不支持
Enum
- 支持
- 最多支持65535个elements

- 不支持
Set
- 支持
- 最多支持64个elements

- 不支持

JSON数据类型

类型MySQLDoris
JSON
- 支持

- 支持
- 1.2的版本,类型关键字为JSONB,2.x版本为JSON

Doris特有的数据类型

  • HyperLogLog:HLL是模糊去重,在数据量大的情况性能优于Count Distinct。
  • BitMap:
    • 离线场景下使用BITMAP会影响导入速度,在数据量大的情况下查询速度会慢于HLL,并优于Count Distinct。
    • 实时场景下BITMAP如果不使用全局字典,使用了bitmap_hash()可能会导致有千分之一左右的误差。如果这个误差不可接受,可以使用bitmap_hash64。
  • QUANTILE_PERCENT:
    • QUANTILE_STATE 是一种计算分位数近似值的类型,在导入时会对相同的key,不同 value 进行预聚合,当value数量不超过2048时采用明细记录所有数据,当 value 数量大于2048时采用 TDigest 算法,对数据进行聚合(聚类)保存聚类后的质心点。
    • 相关函数
      • QUANTILE_UNION(QUANTILE_STATE):
        此函数为聚合函数,用于将不同的分位数计算中间结果进行聚合操作。此函数返回的结果仍是QUANTILE_STATE
      • TO_QUANTILE_STATE(INT/FLOAT/DOUBLE raw_data [,FLOAT compression]):
        此函数将数值类型转化成QUANTILE_STATE类型
        compression参数是可选项,可设置范围是[2048, 10000],值越大,后续分位数近似计算的精度越高,内存消耗越大,计算耗时越长。
        compression参数未指定或设置的值在[2048, 10000]范围外,以2048的默认值运行
      • QUANTILE_PERCENT(QUANTILE_STATE, percent):
        此函数将分位数计算的中间结果变量(QUANTILE_STATE)转化为具体的分位数数值
  • Array
    • 1.2版本:由T类型元素组成的数组,不能作为key列使用。目前支持在Duplicate模型的表中使用。
    • 2.0版本:支持在Unique模型的表中非key列使用。
    • T类型:
      • BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DATE,<br />DATEV2, DATETIME, DATETIMEV2, CHAR, VARCHAR, STRING
  • Map
    • 2.0版本新增数据类型
    • 目前支持在Duplicate,Unique 模型的表中使用。
    • <k,v>支持的类型有:
      • BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DECIMALV3, DATE,<br />DATEV2, DATETIME, DATETIMEV2, CHAR, VARCHAR, STRING
  • Struct
    • 2.0版本新增的数据类型
    • 由多个 Field 组成的结构体,也可被理解为多个列的集合
      • field_name: Field 的标识符,不可重复
      • field_type: Field 的类型
      • COMMENT: Field 的注释,可选 (暂不支持)
    • 目前 STRUCT 仅支持在 Duplicate 模型的表中使用。
    • 暂不支持嵌套
  • Agg_State

语法区别

DDL

Create-Table

Doris建表语法

CREATE TABLE [IF NOT EXISTS] [database.]table
(
    column_definition_list
    [, index_definition_list]
)
[engine_type]
[keys_type]
[table_comment]
[partition_info]
distribution_desc
[rollup_list]
[properties]
[extra_properties]

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database.]table_name 
LIKE [database.]table_name [WITH ROLLUP (r1,r2,r3,...)]

CREATE TABLE table_name [( column_name_list )]
    [engine_type]
    [keys_type]
    [table_comment]
    [partition_info]
    distribution_desc
    [rollup_list]
    [properties]
    [extra_properties]
    as query_sql

与MySQL的不同之处

  • column_definition_list
    • 字段列表定义,基本语法与MySQL类似,会多出一个聚合类型的操作。
    • 聚合类型的操作,主要支持数据模型为AGGREGATE,Unique
    • column_name column_type [KEY] [aggr_type] [NULL] [AUTO_INCREMENT] [default_value] [column_comment]
    • MySQL可以在建表定义字段列表的时候,还可以在字段后面加上Index等约束,例如primary key,unique key等,但是Doris是通过定义数据模型来约束和计算的。
  • index_definition_list
    • 索引列表定义,基本语法与MySQL类似,但是只支持BitMap。
INDEX index_name (col_name) [USING BITMAP] COMMENT 'xxxxxx'
  • 而MySQL支持的index有B+Tree,Hash。
  • engine_type
    • 表引擎类型,可选
    • 目前支持的表引擎
      • olap(内部默认)
      • mysql
      • broker
      • hive
      • iceberg
      • hudi
    • 除了olap是Doris内部表,其余均为在创建外部表的表引擎
    • MySQL支持的存储引擎有:Innodb,MyISAM等
  • keys_type
    • 数据模型,可选
    • 支持的类型
      • DUPLICATE KEY(默认):其后指定的列为排序列。
      • AGGREGATE KEY:其后指定的列为维度列。
      • UNIQUE KEY:其后指定的列为主键列。
    • MySQL则没有数据模型的概念。
  • table_comment
    • 表注释
COMMENT "This is my first DORIS table"
  • partition_info
    • 分区算法,可选
    • 支持的分区算法
      • LESS THAN:仅定义分区上界。下界由上一个分区的上界决定。
      • FIXED RANGE:定义分区的左闭右开区间。
      • MULTI RANGE:批量创建RANGE分区,定义分区的左闭右开区间,设定时间单位和步长,时间单位支持年、月、日、周和小时。
      • MULTI RANGE:批量创建数字类型的RANGE分区,定义分区的左闭右开区间,设定步长。
    • MySQL支持的算法:Hash,Range,List,并且还支持子分区,子分区支持的算法只有Hash。
  • distribution_desc
    • 分桶算法,必选
    • 分桶算法
      • Hash 分桶 语法: DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num|auto] 说明: 使用指定的 key 列进行哈希分桶。
      • Random 分桶 语法: DISTRIBUTED BY RANDOM [BUCKETS num|auto] 说明: 使用随机数进行分桶。
    • MySQL没有分桶算法
  • rollup_list
    • 建表的同时可以创建多个物化视图,可选
    • rollup_name (col1[, col2, ...]) [DUPLICATE KEY(col1[, col2, ...])] [PROPERTIES("key" = "value")]
    • MySQL不支持
  • properties:
    • 表属性
    • 表属性与MySQL的表属性基本不一致
    • 定义表属性的语法也与MySQL不一致
PROPERTIES (
    "replication_num" = "1"
);
create table aaaa(
  
)k1=v1, k2=v2
  • 另外,MySQL支持创建临时表,但Doris不支持,Doris支持创建外部表。

Create-Index

CREATE INDEX [IF NOT EXISTS] index_name ON table_name (column [, ...],) [USING BITMAP] [COMMENT'balabala'];
  • 目前只支持bitmap 索引
  • BITMAP 索引仅在单列上创建
  • MySQL支持的索引算法有“B+Tree,Hash
  • MySQL支持的索引类型有:[UNIQUE | FULLTEXT | SPATIAL]
  • MySQL支持对多个字段进行索引创建

Create-View

CREATE VIEW [IF NOT EXISTS]
 [db_name.]view_name
 (column1[ COMMENT "col comment"][, column2, ...])
AS query_stmt

CREATE MATERIALIZED VIEW view_name as query_stmt
[PROPERTIES ("key" = "value")]
  • 基本语法与MySQL一致
  • 物化视图,目前Doris仅支持单表

Alter-Table/Alter-Index

Doris Alter的语法与MySQL的基本一致,但需要注意的是MySQL还支持Change关键字,但是Doris不支持。

Drop-Table/Drop-Index

Doris Drop的语法与MySQL的基本一致

DML

Insert

INSERT INTO table_name
    [ PARTITION (p1, ...) ]
    [ WITH LABEL label]
    [ (column [, ...]) ]
    [ [ hint [, ...] ] ]
    { VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }

Doris Insert语法与MySQL的基本一致,Doris没有ON DUPLICATE KEY UPDATE语法。没有insert into t1 table t2语法

update

UPDATE target_table [table_alias]
    SET assignment_list
    WHERE condition

assignment_list:
    assignment [, assignment] ...

assignment:
    col_name = value

value:
    {expr | DEFAULT}

UPDATE target_table [table_alias]
    SET assignment_list
    [ FROM additional_tables]
    WHERE condition

Doris Update语法与MySQL基本一致,但需要注意的是必须加上where条件。

Delete

DELETE FROM table_name [table_alias] [PARTITION partition_name | PARTITIONS (partition_name [, partition_name])]
WHERE
column_name op { value | value_list } [ AND column_name op { value | value_list } ...];

该语法只能指定过滤谓词

DELETE FROM table_name [table_alias]
    [PARTITION partition_name | PARTITIONS (partition_name [, partition_name])]
    [USING additional_tables]
    WHERE condition

该语法只能在UNIQUE KEY模型表上使用

  • Doris Delete语法与MySQL基本一致,但是必须加上where条件。

Select

SELECT
    [ALL | DISTINCT | DISTINCTROW | ALL EXCEPT ( col_name1 [, col_name2, col_name3, ...] )]
    select_expr [, select_expr ...]
    [FROM table_references
      [PARTITION partition_list]
      [TABLET tabletid_list]
      [TABLESAMPLE sample_value [ROWS | PERCENT]
        [REPEATABLE pos_seek]]
    [WHERE where_condition]
    [GROUP BY [GROUPING SETS | ROLLUP | CUBE] {col_name | expr | position}]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [INTO OUTFILE 'file_name']
JOIN
table_references:
    table_reference [, table_reference] …
table_reference:
    table_factor
  | join_table
table_factor:
    tbl_name [[AS] alias]
        [{USE|IGNORE|FORCE} INDEX (key_list)]
  | ( table_references )
  | { OJ table_reference LEFT OUTER JOIN table_reference
        ON conditional_expr }
join_table:
    table_reference [INNER | CROSS] JOIN table_factor [join_condition]
  | table_reference STRAIGHT_JOIN table_factor
  | table_reference STRAIGHT_JOIN table_factor ON condition
  | table_reference LEFT [OUTER] JOIN table_reference join_condition
  | table_reference NATURAL [LEFT [OUTER]] JOIN table_factor
  | table_reference RIGHT [OUTER] JOIN table_reference join_condition
  | table_reference NATURAL [RIGHT [OUTER]] JOIN table_factor
join_condition:
    ON conditional_expr
SELECT ...
UNION [ALL| DISTINCT] SELECT ......
[UNION [ALL| DISTINCT] SELECT ...]
WITH
  cte1 AS (SELECT a,b FROM table1),
  cte2 AS (SELECT c,d FROM table2)
SELECT b,d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;

Doris Select语法与MySQL基本一致

Function的区别

粗略的比较一下Doris Function列表和MySQL Function列表,大致一致。

参考文档

Doris Data-Types
MySQL Data-Types
Doris SQL Statement
MySQL SQL Statement
Doris Functions
MySQL Functions