Примечания по совместимости с MySQL
Doris обеспечивает высокую совместимость с протоколом MySQL и стандартным синтаксисом SQL. Бизнес-системы, инструменты BI и скрипты администрирования обычно могут подключаться без существенных изменений. Однако как аналитическая база данных с архитектурой MPP, Doris отличается от 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 | Не поддерживается |
TIMESTAMP_NS — расширение Doris, а не эквивалент типа MySQL TIMESTAMP. Этот тип не учитывает часовой пояс, имеет фиксированную наносекундную точность и поддерживает диапазон от 1677-09-21 00:12:43.145224192 до 2262-04-11 23:47:16.854775807.
Строковые типы
| Тип | 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 при пакетной обработке может влиять на скорость импорта. На больших объёмах данных запросы с 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 |