Как включить большой индекс в 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 без каких-либо дополнительных статьи.