Перейти к содержимому
Последнее обновление

Примечания по совместимости с MySQL

Doris обеспечивает высокую совместимость с протоколом MySQL и стандартным синтаксисом SQL. Бизнес-системы, инструменты BI и скрипты администрирования обычно могут подключаться без существенных изменений. Однако Doris, как база данных с архитектурой MPP, ориентированная на аналитику, всё же отличается от MySQL типами данных, синтаксисом создания таблиц, моделями данных и поведением операций DML.

В этом документе основные различия между Doris и MySQL рассматриваются с точки зрения миграции и повседневной работы, чтобы помочь вам быстро найти несовместимости в синтаксисе или поведении.

Для кого предназначен документ и когда он полезен​

  • Вы планируете перенести приложение или хранилище данных с MySQL на Doris и хотите быстро оценить совместимость SQL.
  • Вы сталкиваетесь с различиями в синтаксисе или поведении, когда пишете SQL для Doris, опираясь на привычки работы с MySQL.
  • Вам нужно проверить, поддерживается ли в Doris определённый тип данных или оператор DDL/DML.

Различия в типах данных​

Ниже перечислены отличия от MySQL, сгруппированные по числовым типам, типам даты и времени, строковым типам, JSON и типам, специфичным для Doris.

Числовые типы​

ТипMySQLDoris
Boolean- Поддерживается
- Диапазон: 0 означает false, 1 означает true
- Поддерживается
- Ключевое слово: Boolean
- Диапазон: 0 означает false, 1 означает true
Bit- Поддерживается
- Диапазон: от 1 до 64
Не поддерживается
Tinyint- Поддерживается
- Поддерживаются знаковые и беззнаковые значения
- Диапазон: для знаковых значений от -128 до 127, для беззнаковых от 0 до 255
- Поддерживается
- Поддерживаются только знаковые значения
- Диапазон: от -128 до 127
Smallint- Поддерживается
- Поддерживаются знаковые и беззнаковые значения
- Диапазон: для знаковых значений от -2^15 до 2^15-1, для беззнаковых от 0 до 2^16-1
- Поддерживается
- Поддерживаются только знаковые значения
- Диапазон: от -32768 до 32767
Mediumint- Поддерживается
- Поддерживаются знаковые и беззнаковые значения
- Диапазон: для знаковых значений от -2^23 до 2^23-1, для беззнаковых от 0 до 2^24-1
Не поддерживается
Int- Поддерживается
- Поддерживаются знаковые и беззнаковые значения
- Диапазон: для знаковых значений от -2^31 до 2^31-1, для беззнаковых от 0 до 2^32-1
- Поддерживается
- Поддерживаются только знаковые значения
- Диапазон: от -2147483648 до 2147483647
Bigint- Поддерживается
- Поддерживаются знаковые и беззнаковые значения
- Диапазон: для знаковых значений от -2^63 до 2^63-1, для беззнаковых от 0 до 2^64-1
- Поддерживается
- Поддерживаются только знаковые значения
- Диапазон: от -2^63 до 2^63-1
LargeintНе поддерживается- Поддерживается
- Поддерживаются только знаковые значения
- Диапазон: от -2^127 до 2^127-1
Decimal- Поддерживается
- Поддерживаются знаковые и беззнаковые значения (поддерживались до версии 8.0.17, в более поздних версиях помечены как устаревшие)
- По умолчанию: Decimal(10, 0)
- Поддерживается
- Поддерживаются только знаковые значения
- По умолчанию: Decimal(9, 0)
Float/Double- Поддерживается
- Поддерживаются знаковые и беззнаковые значения (поддерживались до версии 8.0.17, в более поздних версиях помечены как устаревшие)
- Поддерживается
- Поддерживаются только знаковые значения

Типы даты и времени​

Тип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
.fraction
- Поддерживается
- DATETIME([P]), где необязательный параметр P задаёт точность
- Диапазон: ['0000-01-01 00:00:00[.000000]', '9999-12-31 23:59:59[.999999]']
- Формат: YYYY-MM-DD hh:mm
.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
.fraction
- Поддерживается
- TIMESTAMPTZ([P]), где необязательный параметр P задаёт точность
- Диапазон: ['0000-01-01 00:00:00[.000000]' UTC, '9999-12-31 23:59:59[.999999]' UTC]
- Формат: YYYY-MM-DD hh:mm
.fraction
+XX.XX
Time- Поддерживается
- Time[(p)]
- Диапазон: ['-838:59:59.000000', '838:59:59.000000']
- Формат: hh:mm
.fraction
- Поддерживается для вычислений, но не может храниться в столбце таблицы OLAP
- Time[(p)]
- Диапазон: ['-838:59:59.999999', '838:59:59.999999']
- Формат: hh:mm
.fraction
Year- Поддерживается
- Диапазон: от 1901 до 2155 или 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 байт (1 MB), можно увеличить до 2147483643 байт (2 GB)
Binary- Поддерживается
- Аналогичен Char
Не поддерживается
Varbinary- Поддерживается
- Аналогичен Varchar
Не поддерживается
Blob- Поддерживается
- TinyBlob, Blob, MediumBlob, LongBlob
Не поддерживается
Text- Поддерживается
- TinyText, Text, MediumText, LongText
Не поддерживается
Enum- Поддерживается
- До 65535 элементов
Не поддерживается
Set- Поддерживается
- До 64 элементов
Не поддерживается

Тип данных JSON​

ТипMySQLDoris
JSONПоддерживаетсяПоддерживается

Типы данных, специфичные для Doris​

Следующие типы расширяют возможности Doris по сравнению с MySQL и предназначены для аналитики. Они часто используются для подсчёта уникальных значений, вычисления квантилей и работы с полуструктурированными данными.

  • HyperLogLog

    Тип HLL нельзя использовать в качестве столбца Key. При использовании в таблице с моделью Aggregate соответствующий тип агрегации при создании таблицы задаётся как HLL_UNION. Указывать длину или значение по умолчанию не требуется; система сама управляет длиной в зависимости от степени агрегации данных. Запрашивать и использовать столбцы HLL можно только с помощью соответствующих функций HLL_UNION_AGG, HLL_RAW_AGG, HLL_CARDINALITY и HLL_HASH.

    HLL выполняет приближённый подсчёт уникальных значений и на больших объёмах данных работает быстрее Count Distinct. Погрешность HLL обычно составляет около 1%, а иногда может достигать 2%.

  • BITMAP

    Тип BITMAP нельзя использовать в качестве столбца Key. При использовании в таблице Aggregate для него необходимо задать агрегацию BITMAP_UNION. Указывать длину или значение по умолчанию не требуется; система сама управляет длиной в зависимости от степени агрегации данных. Запрашивать и использовать столбцы BITMAP можно только с помощью соответствующих функций BITMAP_UNION_COUNT, BITMAP_UNION, BITMAP_HASH, BITMAP_HASH64 и других.

    Использование BITMAP в офлайн-сценариях может повлиять на скорость импорта. При больших объёмах данных запросы с ним выполняются медленнее, чем с HLL, но быстрее, чем с Count Distinct. Примечание: в сценариях реального времени, если BITMAP используется без глобального словаря и вместо него применяется BITMAP_HASH(), возможна погрешность около одной тысячной. Если такая погрешность неприемлема, можно использовать BITMAP_HASH64.

  • QUANTILE_PERCENT (QUANTILE_STATE)

    Тип QUANTILE_STATE нельзя использовать в качестве столбца Key. При использовании в таблице с моделью Aggregate соответствующий тип агрегации при создании таблицы задаётся как QUANTILE_UNION. Указывать длину или значение по умолчанию не требуется; система сама управляет длиной в зависимости от степени агрегации данных. Запрашивать и использовать столбцы QUANTILE_STATE можно только с помощью соответствующих функций QUANTILE_PERCENT, QUANTILE_UNION, TO_QUANTILE_STATE и других.

    QUANTILE_STATE предназначен для вычисления приближённых квантилей. Во время импорта он предварительно агрегирует различные значения для одного и того же Key: если количество значений не превышает 2048, все данные записываются подробно; если количество значений превышает 2048, для агрегации (кластеризации) данных используется алгоритм TDigest, а на хранение записываются центроиды кластеров.

  • Array<T>

    Array<T> представляет собой массив элементов типа T и не может использоваться в качестве столбца Key.

  • MAP<K, V>

    Map представляет собой таблицу соответствий между элементами типов K и V и не может использоваться в качестве столбца Key.

  • STRUCT<field_name:field_type, ...>

    Struct представляет собой структуру из нескольких полей, которую также можно рассматривать как набор столбцов. Её нельзя использовать в качестве Key.

    Имена и количество полей в Struct фиксированы, а сами поля всегда Nullable. Поле обычно включает:

    • field_name: идентификатор поля, который должен быть уникальным
    • field_type: тип поля
  • Agg_State

    AGG_STATE нельзя использовать в качестве столбца Key. При создании таблицы также необходимо объявить сигнатуру агрегатной функции.

    Указывать длину или значение по умолчанию не требуется; фактический объём занимаемой памяти зависит от реализации функции.

    AGG_STATE можно использовать только вместе с комбинаторами функций STATE / MERGE / UNION.

Различия в синтаксисе​

Синтаксис SQL в Doris в целом близок к MySQL, но при создании таблиц, индексов и представлений есть собственные расширения и ограничения. Уделите им особое внимание при миграции.

Различия в 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]

Отличия каждого предложения от MySQL приведены ниже:

ПараметрОтличия от MySQL
column_definition_list- Определяет список столбцов. Базовый синтаксис аналогичен MySQL.
- Doris дополнительно поддерживает указание типа агрегации, в основном для модели данных Aggregate Key.
- MySQL позволяет добавлять ограничения, такие как Index, Primary Key и Unique Key, после определения списка столбцов; Doris поддерживает эти ограничения и вычисления с помощью моделей данных.
index_definition_list- Определяет список индексов. Базовый синтаксис аналогичен MySQL.
- Doris поддерживает bitmap-индексы, инвертированные индексы и индексы N-Gram, а также позволяет включать индексы Bloom filter через свойства.
- MySQL поддерживает индексы B+Tree и Hash.
engine_type- Задаёт тип движка таблицы. Необязательный параметр.
- Основной поддерживаемый в настоящее время движок таблиц: собственный движок OLAP.
- MySQL поддерживает такие движки хранения, как InnoDB и MyISAM.
keys_type- Задаёт модель данных. Необязательный параметр.
- Поддерживаются следующие типы:
  1) DUPLICATE KEY (по умолчанию): указанные после него столбцы используются для сортировки;
  2) AGGREGATE KEY: указанные после него столбцы являются столбцами измерений;
  3) UNIQUE KEY: указанные после него столбцы образуют первичный ключ.
- В MySQL нет понятия модели данных.
table_commentКомментарий к таблице.
partition_infoАлгоритм партиционирования. Необязательный параметр.
Doris поддерживает следующие алгоритмы партиционирования:
- LESS THAN: определяет только верхнюю границу партиции; нижняя граница определяется верхней границей предыдущей партиции.
- FIXED RANGE: определяет для партиции интервал, включающий левую границу и исключающий правую.
- MULTI RANGE: создаёт партиции RANGE пакетно, задавая интервалы с включённой левой и исключённой правой границей с помощью единицы времени и размера шага. Поддерживаемые единицы времени: год, месяц, день, неделя и час.

MySQL поддерживает алгоритмы Hash, Range и List Key, а также подпартиции. Для подпартиций поддерживаются Hash и Key.
distribution_desc- Алгоритм распределения по бакетам. Обязательный параметр. Доступны следующие варианты:
  1) Распределение по хешу: DISTRIBUTED BY HASH (k1[, k2 ...]) [BUCKETS num|auto], использует указанные ключевые столбцы для распределения по бакетам на основе хеша;
  2) Случайное распределение: DISTRIBUTED BY RANDOM [BUCKETS num|auto], использует случайные числа для распределения по бакетам.
- В MySQL нет алгоритма распределения по бакетам.
rollup_list- Одновременно с созданием таблицы можно создать несколько синхронных материализованных представлений.
- Синтаксис: rollup_name (col1[, col2, ...]) [DUPLICATE KEY(col1[, col2, ...])][PROPERTIES("key" = "value")].
- В MySQL не поддерживается.
propertiesСвойства таблицы. Сами свойства и синтаксис их определения отличаются от MySQL.

CREATE INDEX​

CREATE INDEX [IF NOT EXISTS] index_name ON table_name (column [, ...],) [USING BITMAP];
  • В настоящее время Doris поддерживает bitmap-индексы, инвертированные индексы, индексы N-Gram и индексы Bloom filter (настраиваются с помощью отдельного синтаксиса).
  • MySQL поддерживает алгоритмы индексации B+Tree и Hash.

CREATE VIEW​

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

CREATE MATERIALIZED VIEW [IF NOT EXISTS] mvName=multipartIdentifier
(LEFT_PAREN cols=simpleColumnDefs RIGHT_PAREN)? buildMode?
(REFRESH refreshMethod? refreshTrigger?)?
(KEY keys=identifierList)?
(COMMENT STRING_LITERAL)?
(PARTITION BY LEFT_PAREN partitionKey = identifier RIGHT_PAREN)?
(DISTRIBUTED BY (HASH hashKeys=identifierList | RANDOM) (BUCKETS (INTEGER_VALUE | AUTO))?)?
propertyClause?
AS query
  • Базовый синтаксис совпадает с MySQL.
  • Помимо логических представлений, Doris поддерживает два типа материализованных представлений: синхронные и асинхронные.
  • MySQL не поддерживает материализованные представления.

ALTER TABLE / ALTER INDEX​

Синтаксис ALTER в Doris в основном совпадает с MySQL.

DROP TABLE / DROP INDEX​

Синтаксис DROP в Doris в основном совпадает с MySQL.

Различия в DML​

INSERT​

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

Синтаксис INSERT в Doris в основном совпадает с MySQL.

UPDATE​

UPDATE target_table [table_alias]
SET assignment_list
WHERE condition

assignment_list:
assignment [, assignment] ...

assignment:
col_name = value

value:
{expr | DEFAULT}

Синтаксис UPDATE в Doris в основном совпадает с 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 } ...];

В Doris приведённый выше синтаксис позволяет задавать только предикаты фильтрации.

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

В Doris приведённый выше синтаксис можно использовать только для таблиц с моделью Unique Key.

Синтаксис DELETE в Doris в основном совпадает с MySQL. Однако, поскольку Doris представляет собой базу данных, ориентированную на аналитику, операции удаления не следует выполнять слишком часто.

SELECT​

SELECT
[hint_statement, ...]
[ALL | DISTINCT]
select_expr [, select_expr ...]
[EXCEPT ( col_name1 [, col_name2, col_name3, ...] )]
[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_count,] row_count | row_count OFFSET offset_count}]
[INTO OUTFILE 'file_name']

Синтаксис SELECT в Doris в основном совпадает с MySQL.

Функции SQL​

Функции Doris охватывают подавляющее большинство функций MySQL. Распространённые строковые функции, функции работы с датами, агрегатные и оконные функции можно использовать напрямую.

SQL Mode​

Doris поддерживает настройку некоторых режимов SQL Mode для управления разбором и выполнением SQL, что упрощает соблюдение соглашений MySQL.

НазваниеПоведение при включенииПоведение при отключенииПримечания
PIPES_AS_CONCATИнтерпретирует символ || как функцию concatИнтерпретирует символ || как логический оператор OR-
NO_BACKSLASH_ESCAPESРассматривает обратную косую черту в строках как обычный символРассматривает обратную косую черту в строках как начало управляющей последовательности-
ONLY_FULL_GROUP_BYРазрешает только стандартную агрегациюРазрешает включать в результат агрегации скалярные значения, не входящие в KEY агрегацииПоддерживается начиная с версии 3.1.0