【问题标题】:How to enable large index in MariaDB 10?如何在 MariaDB 10 中启用大索引?
【发布时间】:2017-09-08 20:02:45
【问题描述】:

在 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 为OFF 时,应该没关系。其实即使我也设置了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 服务器 5.7.17 上,所有相关设置都相同(默认),大索引没有问题(对于 utf8mb4,它是 750*4 = 3000)。

我的 MariaDB 设置有什么问题?

【问题讨论】:

  • 如果你添加ROW_FORMAT=DYNAMIC ?
  • @Hackerman,不能再测试了,因为放弃了 MariaDB 并回到了 MySQL
  • FWIW 它与 MariaDB 无关; MySQL 5.6 也有同样的问题。这在 MariaDB 10.2 中也不是问题。

标签: mysql indexing utf-8 mariadb


【解决方案1】:

在我的 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;

【讨论】:

    【解决方案2】:

    我认为该会话的解决方案已在此处得到解答,但如果您重新启动 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'
    

    希望它有助于减少返工和头上的划痕 :)

    【讨论】:

      【解决方案3】:

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

      到目前为止一切顺利。

      【讨论】:

        【解决方案4】:

        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 创建表,这就是为什么依赖innodb_large_prefix 的相同CREATE 在 MySQL 5.7 和 MariaDB 10.2 中无需任何附加子句即可工作。

        【讨论】:

          【解决方案5】:

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

          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 设置为该值”意味着该设置不是问题。

          【讨论】:

          • 我安装了测试机器,现在可以确认:将ROW_FORMAT=DYNAMIC 添加到CREATE TABLE-statement 是缺少的部分。谢谢!
          • 可以在创建之前设置ALTER TABLE,而不是innodb_default_row_format=DYNAMIC。无论如何,我会将所有这些全局值添加到服务器配置中。下次要创建“大”索引时,无需记住所有这些。
          • 或者升级到5.7就不用担心了。
          猜你喜欢
          • 2021-09-28
          • 2019-10-07
          • 2021-03-19
          • 2011-11-11
          • 2012-09-07
          • 1970-01-01
          • 1970-01-01
          • 2018-02-20
          • 1970-01-01
          相关资源
          最近更新 更多