2014-09-13 90 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)