Skip to main content

6.表大小的限制

MySQL 数据库的有效最大表大小通常由操作系统对文件大小的限制决定,而不是由 MySQL 内部限制决定。 有关操作系统文件大小限制的最新信息,请参阅特定于您的操作系统的文档。

注意:

Windows 用户请注意,FAT 和 VFAT (FAT32) 不适合用于 MySQL 的生产使用。 请改用 NTFS。

如果遇到全表错误,可能有多种原因导致发生:

  • 磁盘可能已满。

  • 正在使用 InnoDB 表,并且 InnoDB 表空间文件中的空间不足。 最大表空间大小也是表的最大大小。

    通常,对于大小大于 1TB 的表,建议将表分区为多个表空间文件。

  • 已达到操作系统文件大小限制。 例如,在仅支持最大 2GB 文件大小的操作系统上使用 MyISAM 表,并且数据文件或索引文件已达到此限制。

  • 正在使用 MyISAM 表,并且该表所需的空间超出了内部指针大小所允许的空间。 默认情况下,MyISAM 允许数据和索引文件增长到 256TB,但可以将此限制更改为最大允许大小 65,536TB(2567 − 1 字节)。

  • 如果需要大于默认限制的 MyISAM 表并且操作系统支持大文件,则 CREATE TABLE 语句支持 AVG_ROW_LENGTH 和 MAX_ROWS 选项。

    如果指针大小对于现有表来说太小,可以使用 ALTER TABLE 更改选项以增加表允许的最大大小。

    ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;

    仅对于具有 BLOB 或 TEXT 列的表,必须指定 AVG_ROW_LENGTH; 在这种情况下,MySQL无法仅根据行数来优化所需的空间。

    要更改 MyISAM 表的默认大小限制,请设置 myisam_data_pointer_size,它设置用于内部行指针的字节数。 如果未指定 MAX_ROWS 选项,则该值用于设置新表的指针大小。 myisam_data_pointer_size 的值可以是从 2 到 7。例如,对于使用动态存储格式的表,值为 4 允许表最大为 4GB; 6 个值允许高达 256TB 的表。 使用固定存储格式的表具有较大的最大数据长度。

    可以使用以下语句检查最大数据和索引大小:

    SHOW TABLE STATUS FROM db_name LIKE 'tbl_name';

    还可以使用 myisamchk -dv /path/to/table-index-file。

    解决 MyISAM 表文件大小限制的其他方法如下:

    • 如果大表是只读的,可以使用myisampack来压缩它。 myisampack 通常会将表压缩至少 50%,因此实际上可以拥有更大的表。 myisampack 还可以将多个表合并为一个表。
    • MySQL 包含一个 MERGE 库,能够处理具有与单个 MERGE 表相同结构的 MyISAM 表集合。
  • 如果正在使用MEMORY(HEAP)存储引擎; 在这种情况下,需要增加 max_heap_table_size 系统变量的值。