Как включить большой индекс в MariaDB 10?
в Debian Jessie я установил MariaDB server 10.0.30 и пытаюсь увеличить максимальную длину ключа. AFAIU это зависит от параметра config innodb_large_prefix
включить. Согласно docs, это также требует barracuda
формат файлов и innodb_file_per_table
. После установки их в config и перезапуска сервера я вижу в клиенте, что эти параметры установлены правильно:
> 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 server 5.7.17 все связанные настройки одинаковы (по умолчанию), и нет проблем с большим индексом (для utf8mb4 это 750*4 = 3000).
что не так с моей настройкой MariaDB?
2 ответов
это требует больше, чем просто эти две настройки...
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 имеет значение " означает, что этот параметр не является проблемой.
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 без каких-либо дополнительных статьи.