Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在MariaDB 10中启用大索引?_Mysql_Indexing_Utf 8_Mariadb - Fatal编程技术网

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

Mysql 如何在MariaDB 10中启用大索引?,mysql,indexing,utf-8,mariadb,Mysql,Indexing,Utf 8,Mariadb,在Debian Jessie中,我安装了MariaDB服务器10.0.30,并尝试增加最大密钥长度。AFAIU这取决于是否启用配置参数innodb\u large\u prefix。根据,它还需要barracuda文件格式和innodb_file_per_表。在配置中设置这些参数并重新启动服务器后,我在客户端中看到这些参数设置正确: > SHOW GLOBAL VARIABLES LIKE 'innodb_large%'; +---------------------+-------+ |

在Debian Jessie中,我安装了MariaDB服务器10.0.30,并尝试增加最大密钥长度。AFAIU这取决于是否启用配置参数
innodb\u large\u prefix
。根据,它还需要
barracuda
文件格式和
innodb_file_per_表
。在配置中设置这些参数并重新启动服务器后,我在客户端中看到这些参数设置正确:

> 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\u file\u format\u max
被设置为
Antelope
,但是当
innodb\u file\u format\u check
被禁用时,这应该无关紧要。事实上,即使我也设置了梭鱼,也没什么不同

如果我现在尝试创建具有大索引的表,例如:

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.
在带有mysql服务器5.7.17的Ubuntu 16.04上,所有相关设置都是相同的(默认情况下),大索引没有问题(对于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\u FORMAT=…
添加到
CREATE表中即可

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

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

(但前缀索引在许多方面都有缺陷。)


“如果服务器稍后创建更高的表格式,则innodb_file_format_max设置为该值”表示该设置不是问题。

innodb_large_prefix
仅适用于
压缩的
动态的
行格式

MariaDB 10.0和10.1具有InnoDB 5.6,默认情况下,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中工作,没有任何附加条款。

在@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'

希望它有助于减少返工和划伤您的头部:)

在我的创建查询中添加
ROW\u 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;

如果你添加了
ROW_FORMAT=DYNAMIC
?@Hackerman,就不能再测试了,因为放弃了MariaDB,回到了MySQLFWIW,它与MariaDB无关;MySQL 5.6也有同样的问题。这在MariaDB 10.2中也不是问题。请参阅solutionI安装的测试机,现在可以确认:将
ROW\u FORMAT=DYNAMIC
添加到
CREATE TABLE
-语句是缺失的部分。非常感谢。您可以在创建表之前设置innodb\u default\u row\u format=DYNAMIC,而不是
ALTER TABLE
。在任何情况下,我都会将所有这些全局值添加到服务器配置中。下次有人想要创建“大型”索引时,不用记住所有这些。或者升级到5.7,不用担心。
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;