【问题标题】:Filesize: CSV vs MySQL文件大小:CSV vs MySQL
【发布时间】:2014-11-07 15:11:57
【问题描述】:

我正在尝试针对 3GB CSV 文件优化我的 MySQL 表结构。到目前为止,我已经成功导入了 19m+ 行中的 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
)

【问题讨论】:

  • 您可能会询问 MySQL 本身有关您的数据的问题!试试SELECT * FROM yourtable PROCEDURE ANALYSE; 看看结果。
  • 你为什么使用utf32编码?如果这只是 ASCII,请使用 utf8。这是一个很好的解释:stackoverflow.com/questions/496321/utf8-utf16-and-utf32.

标签: mysql sql csv filesize


【解决方案1】:

让我们看看字段的大小。

您的数据库结构主要由 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)

【讨论】:

    【解决方案2】:

    两个建议:

    (1) 您的字段

    您可能会就您的数据询问 MySQL 本身!试试看

    SELECT * FROM yourtable PROCEDURE ANALYSE;
    

    看看结果。

    (2) 你的字符集

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-25
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2011-01-07
      • 2012-12-19
      • 1970-01-01
      相关资源
      最近更新 更多