MySQLTable占用太多space?
MySQL Table taking up too much space?
我有一个原始文本文件,大小为 8.1GB。
输入数据非常简单:
Lab_A(字符串),Lab_B(字符串),距离(浮点数)
我尝试使用 LOAD DATA INFILE 将数据加载到 table,但是驱动器 运行 不在 space。
目的地 table 具有以下格式:
Id (INT)、Lab_A (VARCHAR)、Lab_B (VARCHAR)、距离 (FLOAT)。
主键为 Id,索引为 (Lab_A + Distance).
在下面创建语句:
CREATE TABLE 'warwick_word_suite'.'distances' (
'id' INT NOT NULL AUTO_INCREMENT,
'label1' VARCHAR(45) NOT NULL,
'label2' VARCHAR(45) NOT NULL,
'distance' FLOAT NOT NULL,
PRIMARY KEY ('id'),
INDEX 'LABEL_INDEX' ('label1' ASC, 'distance' ASC));
驱动器有 50GB 和 space 中的 运行。鉴于为系统预留了 10GB,我假设 table 为 table.
请求超过 32GB
我的问题是:
- 相对于输入数据的大小,InnoDB table 实际占用了多少?
- 与相同的未索引 table 相比,索引 table 占用更多 space 吗?
我应该为我的数据库服务器订购一个更大的驱动器吗?
编辑:
我追踪到 "ibdata1" 的数据存储在 /var/lib/mysql 中。此文件占用 30.3GB。
双重麻烦。
InnoDB 占用原始数据的 2-3 倍。这是一个粗略的近似值;有很多因素。
ibdata1
是放置 table 的默认位置。尝试将 table 放在那里后,该文件不会缩小。这可能是个问题。在 尝试加载文件之前让 innodb_file_per_table = ON
会更好。然后 table 会进入一个单独的 .ibd
文件,一旦失败,该文件就会消失。实际上,您的磁盘空间不足 space,没有简单的方法可以恢复它。 (恢复包括转储 所有其他 InnoDB tables、停止 mysqld、删除 ibdata1、重新启动,然后重新加载其他 tables。
回到终极问题……如何使用数据。首先,我们可以看到数据样本(几行)吗?可能会有一些线索。 table(或文件中的行)中有多少行?
这可能是加载到 MyISAM 而不是 InnoDB 的情况; table 的大小将接近 8.1GB,加上两个索引,这可能会再增加 5-10GB。仍然紧得令人不快。
标准化实验室名称可能会有很大的收获。假设您有 10K 个实验室和 100M 的距离(每个实验室到其他每个实验室)。其中一半是多余的?规范化实验室名称每行可能会节省 50 字节——可能是 space?
的一半
或者您可以获得更多磁盘 space。
想一想你想解决上面的哪些建议;让我们知道您还需要什么帮助。
我有一个原始文本文件,大小为 8.1GB。 输入数据非常简单: Lab_A(字符串),Lab_B(字符串),距离(浮点数)
我尝试使用 LOAD DATA INFILE 将数据加载到 table,但是驱动器 运行 不在 space。
目的地 table 具有以下格式:
Id (INT)、Lab_A (VARCHAR)、Lab_B (VARCHAR)、距离 (FLOAT)。 主键为 Id,索引为 (Lab_A + Distance).
在下面创建语句:
CREATE TABLE 'warwick_word_suite'.'distances' (
'id' INT NOT NULL AUTO_INCREMENT,
'label1' VARCHAR(45) NOT NULL,
'label2' VARCHAR(45) NOT NULL,
'distance' FLOAT NOT NULL,
PRIMARY KEY ('id'),
INDEX 'LABEL_INDEX' ('label1' ASC, 'distance' ASC));
驱动器有 50GB 和 space 中的 运行。鉴于为系统预留了 10GB,我假设 table 为 table.
请求超过 32GB我的问题是:
- 相对于输入数据的大小,InnoDB table 实际占用了多少?
- 与相同的未索引 table 相比,索引 table 占用更多 space 吗?
我应该为我的数据库服务器订购一个更大的驱动器吗?
编辑: 我追踪到 "ibdata1" 的数据存储在 /var/lib/mysql 中。此文件占用 30.3GB。
双重麻烦。
InnoDB 占用原始数据的 2-3 倍。这是一个粗略的近似值;有很多因素。
ibdata1
是放置 table 的默认位置。尝试将 table 放在那里后,该文件不会缩小。这可能是个问题。在 尝试加载文件之前让 innodb_file_per_table = ON
会更好。然后 table 会进入一个单独的 .ibd
文件,一旦失败,该文件就会消失。实际上,您的磁盘空间不足 space,没有简单的方法可以恢复它。 (恢复包括转储 所有其他 InnoDB tables、停止 mysqld、删除 ibdata1、重新启动,然后重新加载其他 tables。
回到终极问题……如何使用数据。首先,我们可以看到数据样本(几行)吗?可能会有一些线索。 table(或文件中的行)中有多少行?
这可能是加载到 MyISAM 而不是 InnoDB 的情况; table 的大小将接近 8.1GB,加上两个索引,这可能会再增加 5-10GB。仍然紧得令人不快。
标准化实验室名称可能会有很大的收获。假设您有 10K 个实验室和 100M 的距离(每个实验室到其他每个实验室)。其中一半是多余的?规范化实验室名称每行可能会节省 50 字节——可能是 space?
的一半或者您可以获得更多磁盘 space。
想一想你想解决上面的哪些建议;让我们知道您还需要什么帮助。