Как включить большой индекс в 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;
Все идет нормально.