我有一个包含1440个变量的阵列。 类似的东西:
$array = array(1 => 45.76, 2 => 67.56, 3 = 79.23 ..... 1440 => 20.22);
此数组已序列化并插入到MySQL表中,并以longtext作为字段类型。
我现在面临的是一张包含700MB数据的表格,这意味着在不久的将来会出现一些严重的问题。
有没有更好的方法来存储这个数组,我听说过php pack()函数,但它对我有什么帮助?怎么样的mysql BLOB类型而不是longtext?
谢谢
答案 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)
更多信息可能会有所帮助:
以你的例子为代表,我会考虑将每个数乘以100并转换为整数然后存储为原始二进制。您的阵列变为2880字节的数据。如果您的数据很少或永远不会发生变化,您可以非常有效地直接从二进制文件中读取它。
答案 3 :(得分:0)
在现代硬件上,MySQL表中700MB的数据看起来并不那么糟糕。当然,最小化表大小总是更好,因此您可以使用PHP提供的压缩函数之一。 Read on here for more informations
我经常使用gzdeflate,因为它非常快并且可以很好地压缩文本。但是还有很多其他的可用。