文件大小:CSV与MySQL

时间:2014-09-13 16:26:57

标签: mysql sql csv filesize

我正在尝试优化我的MySQL表格结构以获得3GB的CSV文件。到目前为止,我已经成功导入了1900多行中的60%,MySQL表大小为5.5GB。我怎样才能优化我的表结构以减少数据库表的大小? (因为我的磁盘空间不足!)

CSV文件中的示例行

"{0C7ADEF5-878D-4066-B785-0000003ED74A}","163000","2003-02-21 00:00","UB5 4PJ","T","N","F","106","","READING ROAD","NORTHOLT","NORTHOLT","EALING","GREATER LONDON","A"

...我的数据库结构是:

(
`transaction_id` int(10) unsigned NOT NULL,
  `reference` varchar(100) COLLATE utf32_unicode_ci NOT NULL,
  `price` int(10) unsigned NOT NULL,
  `sale_date` date COLLATE utf32_unicode_ci NOT NULL,
  `postcode` varchar(8) COLLATE utf32_unicode_ci NOT NULL,
  `type` varchar(1) COLLATE utf32_unicode_ci NOT NULL,
  `new_build` varchar(1) COLLATE utf32_unicode_ci NOT NULL,
  `tenure` varchar(1) COLLATE utf32_unicode_ci NOT NULL,
  `property_number` varchar(10) COLLATE utf32_unicode_ci NOT NULL,
  `property_name` varchar(100) COLLATE utf32_unicode_ci NOT NULL,
  `street` varchar(100) COLLATE utf32_unicode_ci NOT NULL,
  `area` varchar(100) COLLATE utf32_unicode_ci NOT NULL,
  `city` varchar(100) COLLATE utf32_unicode_ci NOT NULL,
  `county1` varchar(100) COLLATE utf32_unicode_ci NOT NULL,
  `county2` varchar(100) COLLATE utf32_unicode_ci NOT NULL,
  `unknown` varchar(1) COLLATE utf32_unicode_ci NOT NULL
)

2 个答案:

答案 0 :(得分:2)

让我们看一下字段的大小。

您的数据库结构主要由varchars组成。在正常情况下,CSV文件中每个字符大约应该有一个字节。对于长度的开销,这些应该大约相同或稍大(长度为两个字节而逗号为一个)。您可能会在数据库中存入10%的软糖因子。

整数可以是任何一种方式。它们可以是CSV文件中的单个数字(带逗号的两个字符)或几个数字。它们将在MySQL中占用4个字节。 MySQL中的日期可能比CSV文件中的日期小。

索引还有额外的开销,特别是如果您的填充因子在数据页面上留出空间以进行额外存储。数据页面上的其他内容还有额外的开销。但是,你的表似乎比预期的要大得多。

我的猜测是,由于utf32考虑,你的桌子要大得多。如果您没有充分理由,请切换到utf8

作为备注:通常varchar(1) not nullchar(1)可以替换char(1) not null。这可以节省您对长度的编码,这对于这样的小字段来说是一个很大的节省。这也是其他字段的节省如果您知道邮政编码是8个字符,则将其定义为char(8)而不是varchar(8)

答案 1 :(得分:0)

两个建议:

(1)您的字段

您可能会问MySQL自己的数据!试试

SELECT * FROM yourtable PROCEDURE ANALYSE;

并查看结果。

(2)你的字符集

您正在使用utf32。如果由于表/应用程序的其他部分而不需要它,请转而使用utf8