MySQL表占用太多空间?

时间:2017-05-24 11:31:18

标签: mysql innodb

我有一个原始文本文件,大小为8.1GB。 输入数据非常直接: Lab_A(字符串),Lab_B(字符串),距离(浮点)

我试图使用LOAD DATA INFILE将数据加载到表中,但驱动器空间不足。

目标表格式如下:

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并且空间不足。鉴于为系统保留了10GB,我假设该表请求超过>表格为32GB。

我的问题是:

  • 相对于输入数据的大小,InnoDB表实际占用了多少?
  • 与相同的无索引表相比,索引表占用的空间要多得多吗?

我应该为数据库服务器订购一个更大的驱动器吗?

编辑: 我将数据需求跟踪到“ibdata1”,存储在/ var / lib / mysql中。该文件占用30.3GB。

1 个答案:

答案 0 :(得分:0)

双重麻烦。

InnoDB占用原始数据的2倍-3倍。这是粗略的近似;有很多因素。

ibdata1是放置表格的默认位置。试图把表放在那里,该文件不会缩小。这可能是个问题。在尝试加载文件之前让innodb_file_per_table = ON 更好。然后该表将进入一个单独的.ibd文件,一旦失败,该文件就会消失。实际上,您的磁盘空间不足,没有简单的方法来恢复它。 (恢复包括转储所有其他InnoDB表,停止mysqld,删除ibdata1,重新启动,然后重新加载其他表。

回到最终问题......如何使用数据。首先,我们可以看到数据的样本(几行)。可能有一些线索。表格中的行数(或文件中的行数)?

这可能是加载到MyISAM而不是InnoDB的情况;该表的大小将接近8.1GB,加上两个索引,可能会增加另外5-10GB。仍然令人不快地紧张。

将实验室名称标准化可能会有很大的好处。假设你有10K实验室和100M距离(每个实验室到每个其他实验室)。其中一半是多余的?标准化实验室名称每行可节省50个咬 - 可能是空间的一半?

或者你可以获得更多的磁盘空间。

考虑您要解决的上述建议;让我们知道你还需要什么帮助。