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

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

Doris обеспечивает высокую совместимость с протоколом MySQL и стандартным синтаксисом SQL. Бизнес-системы, инструменты BI и скрипты администрирования обычно могут подключаться без существенных изменений. Однако как аналитическая база данных с архитектурой MPP, Doris отличается от 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
Не поддерживается

TIMESTAMP_NS — расширение Doris, а не эквивалент типа MySQL TIMESTAMP. Этот тип не учитывает часовой пояс, имеет фиксированную наносекундную точность и поддерживает диапазон от 1677-09-21 00:12:43.145224192 до 2262-04-11 23:47:16.854775807.

Строковые типы​

Тип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 при пакетной обработке может влиять на скорость импорта. На больших объёмах данных запросы с 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 — тип для приближённого вычисления квантилей. Во время импорта он предварительно агрегирует разные значения Value для одного и того же Key: если количество значений Value не превышает 2048, все данные сохраняются в полном объёме; если количество значений Value превышает 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 также можно включить через свойства.
- 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 (настраиваются с помощью отдельного синтаксиса).
  • 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​

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

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