【问题标题】:What is the default table storage format for Swisscom MariaDb Ent?Swisscom MariaDb Ent 的默认表格存储格式是什么?
【发布时间】:2017-11-09 13:43:37
【问题描述】:

当创建这样的表时

CREATE TABLE `dummy` (
  `userid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `providerid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `provideruserid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

并定义如下所示的 PK:

ALTER TABLE dummy ADD PRIMARY KEY (userid,providerid,provideruserid);

我收到此错误:

Error: Specified key was too long; max key length is 767 bytes

我认为以下设置正确,因此很可能不是问题:

innodb_file_format=Barracuda
innodb_file_per_table=ON
innodb_large_prefix=ON

很可能是表存储格式在此处引起了问题,但我无法检查定义的默认值。 根据documentation,MariaDB(从 10.2.2 开始)的默认表存储格式是 DYNAMIC - 如果是 DYNAMIC,那么这将是完美的,但似乎并非如此。

有谁知道 Swisscom MariaDB Ent 中的默认表存储格式。为什么不是DYNAMIC? (可能:))

【问题讨论】:

  • 255 通常是多余的。 191 适合。 10.2 也增加了 767 的限制。

标签: mariadb swisscomdev


【解决方案1】:

我们在 Prd 中的 MariaDB 版本:

select VERSION();
+-----------------+
| VERSION()       |
+-----------------+
| 10.1.22-MariaDB |
+-----------------+
1 row in set (0.00 sec)

引用自 MariaDB KB XtraDB/InnoDB Storage Formats

Compact

Compact 是 MariaDB 10.2.1 之前的默认格式,适用于 如果使用 Antelope 文件格式,则用于一般用途。被介绍了 在 MySQL 5.0 中。

Compact 存储格式中(如在冗余中)BLOBTEXT 列 部分存储在行页中。至少 767 个字节存储在 该行;超过此值的值存储在专用 页。由于Compact 和冗余行的最大大小约为 8000 字节,这限制了可以使用的BLOBTEXT 列的数量 在一张桌子上。无论数据大小,每个BLOB 页面为 16KB。

其他列也可以存储在不同的页面中,如果它们超过 行页的大小限制。

我们在 Lab 中的 MariaDB 版本(即将在 Prd 上部署)。这是relevant line in bosh release

select VERSION();
+-----------------+
| VERSION()       |
+-----------------+
| 10.1.26-MariaDB |
+-----------------+
1 row in set (0.00 sec)

如何修复 Swisscom Application Cloud 上的错误 ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.(查看差异 ROW_FORMAT=DYNAMIC):

MariaDB [stackoverflow]> CREATE TABLE `dummy` (
    ->   `userid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    ->   `providerid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    ->   `provideruserid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
    -> ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.02 sec)

MariaDB [stackoverflow]> ALTER TABLE dummy ADD PRIMARY KEY (userid,providerid,provideruserid);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [stackoverflow]> show index from dummy;
+-------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name    | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| dummy |          0 | PRIMARY  |            1 | userid         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| dummy |          0 | PRIMARY  |            2 | providerid     | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| dummy |          0 | PRIMARY  |            3 | provideruserid | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)

复制粘贴代码如下:

CREATE TABLE `dummy` 
             ( 
                          `userid`         VARCHAR(255) collate utf8mb4_unicode_ci NOT NULL, 
                          `providerid`     VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL, 
                          `provideruserid` VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL 
             ) 
             engine=innodb row_format=dynamic DEFAULT charset=utf8mb4 COLLATE=utf8mb4_unicode_ci;

【讨论】:

  • @fyobor-glebov 非常感谢您的详细解释只是对您的回答的评论:“如果使用 Antelope 文件格式,则适用于一般用途”......情况并非如此,默认文件格式为“梭子鱼”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多