Как включить большой индекс в MariaDB 10?

В Debian Jessie я установил сервер MariaDB 10.0.30, и я пытаюсь увеличить максимальную длину ключа. AFAIU зависит от параметра конфигурации innodb_large_prefix. Согласно документации, это также требует barracuda формат файла и innodb_file_per_table. После установки их в конфигурации и перезапуска сервера я вижу на клиенте, что эти параметры установлены правильно:

> SHOW GLOBAL VARIABLES LIKE 'innodb_large%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_large_prefix | ON    |
+---------------------+-------+
1 row in set (0.00 sec)

> SHOW GLOBAL VARIABLES LIKE 'innodb_file%';
+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| innodb_file_format       | Barracuda |
| innodb_file_format_check | OFF       |
| innodb_file_format_max   | Antelope  |
| innodb_file_per_table    | ON        |
+--------------------------+-----------+
4 rows in set (0.00 sec)

> SHOW GLOBAL VARIABLES LIKE 'innodb_page%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)

Я не уверен, почему innodb_file_format_max установлен Antelope, но пока innodb_file_format_check выключен, это не имеет значения. На самом деле, даже если бы у меня было это, то и Barracuda, это не имело значения.

Если я попытаюсь создать таблицу с большим индексом, например:

CREATE TABLE 'some_table' (
  'some_tableID' int(10) unsigned NOT NULL AUTO_INCREMENT,
  'column' varchar(750) COLLATE utf8mb4_estonian_ci NOT NULL DEFAULT '',
  PRIMARY KEY ('some_tableID'),
  KEY 'column' ('column') 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_estonian_ci;

Я получаю ошибку:

ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

На Ubuntu 16.04 с сервером mysql 5.7.17 все связанные настройки одинаковы (по умолчанию), и нет проблемы с большим индексом (для utf8mb4 это 750 * 4 = 3000).

Что не так с моей настройкой MariaDB?

Ответы

Ответ 1

Это требует не только этих двух настроек...

SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=ON;
SET GLOBAL innodb_large_prefix=1;
logout & login (to get the global values);
ALTER TABLE tbl ROW_FORMAT=DYNAMIC;  -- or COMPRESSED

Возможно, вам нужно добавить ROW_FORMAT=... в CREATE TABLE.

Эти инструкции необходимы для 5.6.3 до 5.7.7. Начиная с 5.7.7, система по умолчанию правильно обрабатывает большие поля.

Кроме того, вы можете использовать индекс "префикс":

INDEX(column(191))

(Но префиксная индексация испорчена многими способами.)

"Если сервер позже создает более высокий формат таблицы, innodb_file_format_max установлен в это значение" означает, что этот параметр не является проблемой.

Ответ 2

innodb_large_prefix относится только к COMPRESSED и DYNAMIC форматам строк.

В MariaDB 10.0 и 10.1 есть InnoDB 5.6, который по умолчанию создает таблицы с ROW_FORMAT=Compact (даже если innodb_file_format установлен в Barracuda). Итак, чтобы использовать большие префиксы, вам нужно явно указать формат строки. То же самое верно для MySQL 5.6.

InnoDB 5.7 по умолчанию создает таблицу с ROW_FORMAT=DYNAMIC, поэтому тот же CREATE полагающийся на innodb_large_prefix работает в MySQL 5.7 и MariaDB 10.2 без каких-либо дополнительных предложений.

Ответ 3

После шагов, предоставленных @Rick:

SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=ON;
SET GLOBAL innodb_large_prefix=1;
-- logout & login (to get the global values);

Я изменил последний шаг на

SET GLOBAL innodb_default_row_format=DYNAMIC;

Все идет нормально.