【问题标题】:MySQL and PHP array storing questionMySQL和PHP数组存储问题
【发布时间】:2009-09-28 13:00:12
【问题描述】:

我有一个包含 1440 个变量的数组。 类似:

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

这个数组被序列化并插入到MySQL表中,字段类型为longtext。

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

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

谢谢

【问题讨论】:

  • 您期望该数据的价值范围是多少?
  • 0-999.99,键总是0-1440

标签: php mysql


【解决方案1】:

不要以这种方式存储数组。数组语法会产生巨大的开销。

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

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 的(整数)外键,其中包含有关数组的更多信息。

【讨论】:

  • 您还应该定义一个列以连接到arras 表,以及该列上的索引,以及任何已排序列上的索引(可能是index)。 name 列的用途是什么?
  • 如果所有值都是 XX.XX 格式,可以使用 DECIMAL(2,2) 作为列类型。
  • 我认为这不是一个好的解决方案,这意味着我现在有 800 万条记录,而每天我将获得 1500000 条记录。
【解决方案2】:

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

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

以您的示例为代表,我会考虑将每个数字乘以 100 并转换为整数,然后存储为原始二进制文件。你的数组变成了 2880 字节的数据。如果您的数据很少或从不更改,您可以非常有效地直接从二进制文件中跳过读取。

【讨论】:

  • 此数据表示一天中的分钟数 (1440) 和一个十进制值,其中 999.99 对某个人来说可能最高。因此,在一张表中有很多人每天都有分钟值条目。数据每 5 分钟更改一次,根据用户要求提供。
  • 所以每 5 分钟为每个人存储 5 个新值?并且在任何时候,一个人都可以请求他们最后一天的数据?值 - 心率是什么意思?您是否曾经一次存储超过一天,或者这就像一个循环队列,即每人总是正好有 1440 个值?到目前为止,我必须同意 Martijn 的观点——规范化到数据库表可能是处理这个问题的最有效的解决方案。如果存储多天的数据,可能值得拥有一个辅助存档表并每隔几个小时从第一个表中复制/删除。
【解决方案3】:

查看gzdeflate 以了解压缩字符串。文档中的示例:

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

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

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

【讨论】:

    【解决方案4】:

    在现代硬件上,MySQL 表中 700MB 的数据看起来还不错。当然,最好尽量减少表的大小,因此您可以使用 PHP 提供的一种压缩功能。 Read on here for more informations.

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

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      相关资源
      最近更新 更多