10.4.6 表大小限制
MySQL 数据库的实际最大表大小通常由操作系统对文件大小的限制而不是 MySQL 内部限制。关于操作系统文件大小限制的最新信息,请查看适用于您的操作系统的文档。
Windows 用户请注意,FAT 和 VFAT(FAT32)不适合在生产环境中与 MySQL 一起使用。请使用 NTFS 替代。
如果您遇到满表错误,有多种原因可能会导致这种情况:
-
磁盘可能已满。
-
您使用的是
InnoDB
表,并且已经耗尽了InnoDB
表空间文件中的可用空间。表空间文件的最大大小也是表的最大大小。关于表空间大小限制,请查看第17.21节,“InnoDB Limits”。通常情况下,表的分区到多个表空间文件中是对大于 1TB 大小的表的建议。
-
您已经达到操作系统文件大小限制。例如,您使用的是
MyISAM
表,在支持文件大小为 2GB 的操作系统上,您已经达到这个限制,因为是数据文件或索引文件的大小。 -
您使用的是
MyISAM
表,并且表中的空间需求超过了内部指针大小的限制。MyISAM
允许数据和索引文件增长到默认的 256TB,但这可以更改到最大可达 65,536TB(2567 - 1 字节)的限制。如果您需要一个大于默认限制的
MyISAM
表,并且您的操作系统支持大文件,您可以使用CREATE TABLE
语句中的AVG_ROW_LENGTH
和MAX_ROWS
选项。查看第15.1.20节,“CREATE TABLE 语句”。服务器使用这些选项来确定表的最大可达大小。如果指针大小不足以容纳现有表,可以使用
ALTER TABLE
语句来增加表的最大可达大小。查看第15.1.9节,“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大小的表。使用固定存储格式的表可以存储更大的数据。关于存储格式的特点,请参见第18.2.3节,“MyISAM Table Storage Formats”。您可以使用以下语句检查最大数据和索引大小:
SHOW TABLE STATUS FROM db_name LIKE 'tbl_name';
您也可以使用myisamchk -dv /path/to/table-index-file。请参见第15.7.7节,“SHOW Statements”,或第6.6.4节,“myisamchk — MyISAM Table-Maintenance Utility”。
其他方法可以绕过
MyISAM
表的文件大小限制:-
如果您的大表是只读的,可以使用myisampack将其压缩。myisampack通常可以将表压缩到50%以下,因此您可以拥有更大的表。myisampack也可以将多个表合并到一个表中。请参见第6.6.6节,“myisampack — Generate Compressed, Read-Only MyISAM Tables”。
-
MySQL还包括了
MERGE
库,可以将多个MyISAM
表作为一个MERGE
表来处理。请参见第18.7节,“The MERGE Storage Engine”。
-
-
您正在使用
MEMORY
(HEAP
)存储引擎;在这种情况下,您需要增加max_heap_table_size
系统变量的值。请参见第7.1.8节,“Server System Variables”。