如何在MariaDB 10中启用大型索引?

w.k*_*w.k 15 mysql indexing utf-8 mariadb

在Debian Jessie中,我安装了MariaDB服务器10.0.30,并尝试增加最大密钥长度.AFAIU取决于innodb_large_prefix启用的配置参数.根据文档,它还需要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)
Run Code Online (Sandbox Code Playgroud)

我不确定,为什么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;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
Run Code Online (Sandbox Code Playgroud)

在Ubuntu 16.04上,mysql服务器5.7.17的所有相关设置都是相同的(默认情况下),大索引没有问题(对于utf8mb4,它是750*4 = 3000).

我的MariaDB设置有什么问题?

Ric*_*mes 26

它需要的不仅仅是这两个设置......

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
Run Code Online (Sandbox Code Playgroud)

也许你只需要添加ROW_FORMAT=...到你的CREATE TABLE.

5.6.3至5.7.7需要这些说明.从5.7.7开始,系统默认正确处理更大的字段.

或者,您可以使用"前缀"索引:

INDEX(column(191))
Run Code Online (Sandbox Code Playgroud)

(但前缀索引在很多方面存在缺陷.)

"如果服务器稍后创建更高的表格格式,则将innodb_file_format_max设置为该值"意味着该设置不是问题.


ele*_*nst 9

innodb_large_prefix仅适用于COMPRESSEDDYNAMIC行格式.

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中的工作而没有任何附加条款.


Koj*_*ojo 5

在@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);
Run Code Online (Sandbox Code Playgroud)

我将最后一步更改为

SET GLOBAL innodb_default_row_format=DYNAMIC;
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。