PHP';海量数据的自然排序存储问题

PHP';海量数据的自然排序存储问题,php,mysql,sorting,memory,natural-sort,Php,Mysql,Sorting,Memory,Natural Sort,我正在使用php的自然排序算法natsort,但我考虑了内存使用问题 事情就是这样。脚本从mysql中提取数据并将结果放入数组中,然后对其应用natsort。但问题是。行的文本可以很长,并且可以有数百行 示例代码: $array = array(); while ($row = $db->getResults()) { $array[$row->code] = $row->text; } if (empty($array)) { uksort($array, "str

我正在使用php的自然排序算法
natsort
,但我考虑了内存使用问题

事情就是这样。脚本从mysql中提取数据并将结果放入数组中,然后对其应用
natsort
。但问题是。行的文本可以很长,并且可以有数百行

示例代码:

$array = array();
while ($row = $db->getResults()) {
  $array[$row->code] = $row->text;
}

if (empty($array)) {
  uksort($array, "strnatcmp");
}

我想知道这对记忆有什么影响?这是合适的方法还是我应该做一些更有效、内存更愉快的事情?

您需要使用MySQL
WHERE
GROUP BY
,和ORDER BY子句,这样您就不会浪费时间在PHP级别解析数千条不需要的记录。

您可以做的一件事是存储一个新列,该列与要排序的列重复,但以转换后的格式存储,在使用常规排序算法时会自然排序

从概念上讲,您可以通过将数字序列中的零填充到与字符串中可能出现的最长数字序列一样长的长度来实现这一点

我的解决方案不是完全坚固的,但是如果你的字符串只有已知最大长度的数字序列,那么你可以用零填充到已知的最大长度。例如,如果您的cd曲目标题中嵌入了曲目编号,如:

1 Foo
2 Bar
...
10 Baz
也许您决定最长的数字序列可能是3(999个可能的音轨),所以您可以像这样填充数字序列

001 Foo
002 Bar
...
010 Baz
这适用于具有多个数字序列的字符串

示例php代码,不过您可以编写一个mysql存储函数来实现这一点,然后在表上使用insert和update触发器,以便透明地维护它

$input = 'a44b1c399d4';
$nat = preg_replace_callback('#\d+#', function($m) {
    return str_pad($m[0], 3, '0', STR_PAD_LEFT);
}, $input);
echo $nat; // a044b001c399d004
然后通过mysql进行排序

order by natsort_column

这还可以让您在该列上添加索引,从而提供良好的排序性能。

@Jack MySQL可以高效地进行自然排序吗?没错。我避免使用mysql natsort,因为本机不支持它。所以我更喜欢php的natsort。@JoachimIsaksson好吧,那应该是问题了,不是吗?:)@Jack,MySQL没有一个很好的自然排序解决方案。。看看,或者你只是创建一个额外的列,以便mysql能够可靠地排序。我知道这一点,但我如何在mysql中应用natsort?重要的是将结果限制在您需要的记录上。只要记录有限,您就可以在PHP中对它们进行排序,可能没有MySQL存储过程快,但速度足够快,因为您不应该获取太多行。如果你像你说的那样获取了数百个,那么1)你的应用程序的设计有问题,2)这是一个不经常运行的管理报告页面,所以不是什么大问题,3)你需要将结果限制在你需要的列,或者4)一旦结果被排序,就需要实现缓存。@Xeoncross限制结果并在以后进行排序在一般情况下是非常重要的,因为要获得例如正确的50条记录,您需要排序以知道它们是什么。可能有特定于应用程序的方法,在这种情况下,我完全同意应该限制数据库中的内容。@Xeoncross我完全同意你的看法。但是我怎么知道在PHP中应用排序的限制在哪里呢?如果我是正确的,那么我应该从mysql获得结果,在输出中添加另一列,然后再次使用该字段查询sql?你能给出一个mysql过程的例子来在第一次查询中应用这段代码吗?@rambo.coder:你也有上面mysql代码的例子吗?没有,但是你可以用一个存储函数来编写它。只需在其中使用一个循环,使用类似locate()concat()substr()的mysql字符串函数@rambo.coder:谢谢,但我刚刚找到了一个解决方案:@rambo.coder:哦,如果没有结构化列,您的解决方案将中断。