MySQL和PHP数组存储问题

时间:2009-09-28 13:00:12

标签: php mysql

我有一个包含1440个变量的阵列。 类似的东西:

$array = array(1 => 45.76, 2 => 67.56, 3 = 79.23 ..... 1440 => 20.22);

此数组已序列化并插入到MySQL表中,并以longtext作为字段类型。

我现在面临的是一张包含700MB数据的表格,这意味着在不久的将来会出现一些严重的问题。

有没有更好的方法来存储这个数组,我听说过php pack()函数,但它对我有什么帮助?怎么样的mysql BLOB类型而不是longtext?

谢谢

4 个答案:

答案 0 :(得分:4)

不要以这种方式存储数组。数组语法将带来巨大的开销。

最好为每个条目使用一行,如下所示:

TABLE `array_entries` (
    `Index` INT UNSIGNED NOT NULL,
    `Value` DOUBLE,
    `Name` CHAR(8) COMMENT 'name of the array the entry belongs to',
    PRIMARY KEY (`Name`, `Index`)
);

允许您在一个表中存储多个数组,并且只加载您需要的数据(或者如果您愿意,可以加载整个数组)。

当然,您可以将Name替换为指向包含有关数组的更多信息的表arrays的(整数)外键。

答案 1 :(得分:1)

查看gzdeflate来压缩字符串。 doc:

中的示例
<?php
$compressed = gzdeflate('Compress me', 9);
echo $compressed;
?>

所以在你的情况下,这样的事情可能会这样:

<?php
$compressed = gzdeflate(serialize($array), 9); //or var_export?
echo $compressed;
?>

答案 2 :(得分:1)

更多信息可能会有所帮助:

  • 你从哪里获得这些数据?
  • 它实际上是数字,还是只是为了你的例子而简化?如果是数字,需要什么范围/精度?它是离散数据,即来自有限的重复值选择吗?数据是否必须准确,或者近似值是否足够好?
  • 这是什么意思?你是怎么用的?
  • 您最感兴趣的是速度,存储空间,代码清洁度,还是什么?
  • 多久更改一次?
  • 700Mb是一个阵列吗?您的PHP实例是否内存有限?您是否了解了脚本使用了多少内存,以及它们随不同阵列大小的变化情况?
  • 您预计会看到的最大单个阵列(项目/存储空间数量)是多少?
  • 您可能需要处理多少个不同的数据阵列?
  • 数据集之间是否存在“重叠”,即重复出现的数据?

以你的例子为代表,我会考虑将每个数乘以100并转换为整数然后存储为原始二进制。您的阵列变为2880字节的数据。如果您的数据很少或永远不会发生变化,您可以非常有效地直接从二进制文件中读取它。

答案 3 :(得分:0)

在现代硬件上,MySQL表中700MB的数据看起来并不那么糟糕。当然,最小化表大小总是更好,因此您可以使用PHP提供的压缩函数之一。 Read on here for more informations

我经常使用gzdeflate,因为它非常快并且可以很好地压缩文本。但是还有很多其他的可用。