2014-09-13 161 views
1

我想优化我的MySQL表结构的3GB CSV文件。到目前为止,我已经设法导入19m +行中的60%,MySQL表的大小为5.5GB。我怎样才能优化我的表结构来减少数据库表的大小? (如!我正在运行的磁盘空间不足)文件大小:CSV vs MySQL

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 
) 
+0

您可能会问MySQL有关您的数据!尝试'SELECT * FROM yourtable PROCEDURE ANALYZE;'并查看结果。 – Bjoern 2014-09-13 16:32:02

+1

你为什么使用'utf32'编码?如果这只是ASCII,请使用'utf8'。这是一个很好的解释:http://stackoverflow.com/questions/496321/utf8-utf16-and-utf32。 – 2014-09-13 16:32:28

回答

0

两个建议:

(1)你的领域

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

SELECT * FROM yourtable PROCEDURE ANALYSE; 

并看看结果。

(2)你的字符集

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

2

让我们来看看字段的大小。

您的数据库结构主要由varchars组成。在正常情况下,CSV文件中的每个字符应该大约一个字节。随着长度的开销,这些应该大致相同或稍大一些(两个字节的长度与一个逗号的长度)。你可能会在数据库中存储10%的模糊因子。

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

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

我的猜测是,由于utf32的考虑因素,您的表格要大得多。如果您没有足够的理由,请切换到utf8

作为说明:通常varchar(1) not null可以替换为char(1)char(1) not null。这可以节省您对长度的编码,这对于这些小型领域来说是一项巨大的节省。如果您知道邮政编码为8个字符,则将其定义为char(8)而不是varchar(8)