如何在 MariaDB 10 中启用大索引?
How to enable large index in MariaDB 10?
在 Debian Jessie 中,我安装了 MariaDB 服务器 10.0.30,并尝试增加最大密钥长度。 AFAIU 这取决于启用的配置参数 innodb_large_prefix
。根据 docs,它还需要 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
,也没有什么区别。
如果我现在尝试使用大索引创建 table,例如:
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 设置有什么问题?
它需要的不仅仅是这两个设置...
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开始,系统默认正确处理更大的字段。
或者,您可以使用 "prefix" 索引:
INDEX(column(191))
(但是前缀索引在很多方面都有缺陷。)
"If the server later creates a higher table format, innodb_file_format_max is set to that value" 表示该设置不是问题。
innodb_large_prefix
仅适用于 COMPRESSED
和 DYNAMIC
行格式。
MariaDB 10.0 和 10.1 有 InnoDB 5.6,它默认创建 tables 和 ROW_FORMAT=Compact
(即使 innodb_file_format
设置为 Barracuda
)。因此,要使用大前缀,您需要明确指定行格式。 MySQL 5.6.
也是如此
InnoDB 5.7 默认创建 table 和 ROW_FORMAT=DYNAMIC
,这就是为什么 CREATE
依赖 innodb_large_prefix
在 MySQL 5.7 和 MariaDB 中工作10.2 没有任何附加条款。
在@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;
到目前为止一切顺利。
我认为这里已经回答了会话的解决方案,但是如果您重新启动 MySQL,我认为这些设置将不起作用。
对于永久解决方案,您需要在 My.Ini 文件中输入以下代码-
## Innodb settings to bypass error of max size 737
innodb-file-format=barracuda
innodb-file-per-table=ON
innodb-large-prefix=ON
## Above 3 didnot work so i added below
innodb_default_row_format = 'DYNAMIC'
希望它有助于减少返工和头上的划痕:)
在我的 CREATE 查询中添加 ROW_FORMAT=DYNAMIC
对我有用。
你的情况是:
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 ROW_FORMAT=DYNAMIC;
在 Debian Jessie 中,我安装了 MariaDB 服务器 10.0.30,并尝试增加最大密钥长度。 AFAIU 这取决于启用的配置参数 innodb_large_prefix
。根据 docs,它还需要 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
,也没有什么区别。
如果我现在尝试使用大索引创建 table,例如:
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 设置有什么问题?
它需要的不仅仅是这两个设置...
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开始,系统默认正确处理更大的字段。
或者,您可以使用 "prefix" 索引:
INDEX(column(191))
(但是前缀索引在很多方面都有缺陷。)
"If the server later creates a higher table format, innodb_file_format_max is set to that value" 表示该设置不是问题。
innodb_large_prefix
仅适用于 COMPRESSED
和 DYNAMIC
行格式。
MariaDB 10.0 和 10.1 有 InnoDB 5.6,它默认创建 tables 和 ROW_FORMAT=Compact
(即使 innodb_file_format
设置为 Barracuda
)。因此,要使用大前缀,您需要明确指定行格式。 MySQL 5.6.
InnoDB 5.7 默认创建 table 和 ROW_FORMAT=DYNAMIC
,这就是为什么 CREATE
依赖 innodb_large_prefix
在 MySQL 5.7 和 MariaDB 中工作10.2 没有任何附加条款。
在@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;
到目前为止一切顺利。
我认为这里已经回答了会话的解决方案,但是如果您重新启动 MySQL,我认为这些设置将不起作用。
对于永久解决方案,您需要在 My.Ini 文件中输入以下代码-
## Innodb settings to bypass error of max size 737
innodb-file-format=barracuda
innodb-file-per-table=ON
innodb-large-prefix=ON
## Above 3 didnot work so i added below
innodb_default_row_format = 'DYNAMIC'
希望它有助于减少返工和头上的划痕:)
在我的 CREATE 查询中添加 ROW_FORMAT=DYNAMIC
对我有用。
你的情况是:
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 ROW_FORMAT=DYNAMIC;