Примечания по совместимости с MySQL
Doris обеспечивает высокую совместимость с протоколом MySQL и стандартным синтаксисом SQL. Бизнес-системы, инструменты BI и скрипты администрирования обычно могут подключаться без существенных изменений. Однако Doris, как база данных с архитектурой MPP, ориентированная на аналитику, всё же отличается от MySQL типами данных, синтаксисом создания таблиц, моделями данных и поведением операций DML.
В этом документе основные различия между Doris и MySQL рассматриваются с точки зрения миграции и повседневной работы, чтобы помочь вам быстро найти несовместимости в синтаксисе или поведении.
Для кого предназначен документ и когда он полезен
- Вы планируете перенести приложение или хранилище данных с MySQL на Doris и хотите быстро оценить совместимость SQL.
- Вы сталкиваетесь с различиями в синтаксисе или поведении, когда пишете SQL для Doris, опираясь на привычки работы с MySQL.
- Вам нужно проверить, поддерживается ли в Doris определённый тип данных или оператор DDL/DML.
Различия в типах данных
Ниже перечислены отличия от MySQL, сгруппированные по числовым типам, типам даты и времени, строковым типам, JSON и типам, специфичным для Doris.
Числовые типы
| Тип | MySQL | Doris |
|---|---|---|
| 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, в более поздних версиях помечены как устаревшие) | - Поддерживается - Поддерживаются только знаковые значения |
Типы даты и времени
| Тип | MySQL | Doris |
|---|---|---|
| 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 | Не поддерживается |
Строковые типы
| Тип | MySQL | Doris |
|---|---|---|
| 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
| Тип | MySQL | Doris |
|---|---|---|
| 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 |