查询MySQL中的100万条记录到PHP

时间:2015-11-27 14:42:09

标签: php mysql arrays

我的最终目标是向Google Maps API发送300万条记录,以显示为标记,但在此之前......

我甚至无法在PHP数组中加载100万。每个元素的数据为18位,包含2列和100万行。

查询只是一个直接SELECT *,但在循环并将正确的记录存储在数组中时,我的内存不足。我尝试过使用SplFixedArray,但也没有运气。

我需要找到一个很好的方法来批量处理并将其拆分 - 运行一些测试后,我可以将大约500k拉入数组而不会达到内存限制(已经是512M!),所以我可以这样做在2或3个查询?在页面加载之前我仍然需要在服务器端保存到数组中的全部数据,我可以将它传递给Maps,所以我假设批处理它不会解决它,因为它仍然会在内存中? / p>

编辑:有一个很大的评论链在增长,但大多数人都认为这是一个坏主意,出于某种原因。所以我的解决方案是将它拉回到大约300k点,这可以通过更少的头部攻击来实现。

2 个答案:

答案 0 :(得分:2)

尝试将数百万张地图标记输入谷歌地图确实没有任何意义。

从内存角度或性能角度来看,这是不可行的。只要考虑一下这些数据的大小 - 即使每个标记只是一个字节的数据,也就是3兆字节。但实际上,每个标记最少需要大约20个字节,仅用于co-ords和JSON标记,因此在你开始为每个标记添加描述之前需要60兆字节。您的系统无法以足够快的速度将其传输到Google,以使其在网络上可用。即使你可以,Google也不会接受你每次有人想看你的地图时都向他们发送那些数据量。

无论如何,地图上的所有标记都无法使用;他们会掩盖整个地图和彼此,只是弄得一团糟。

即使向Google发送几百张地图标记也会推动它。发送数百万美元是不会发生的。

那你可以做什么呢?其他网站如何设法同时拥有数千万个标记?答案很简单 - 他们没有。他们只会向Google发送标记,以显示正在显示的地图部分。

在更宽的缩放级别,您甚至不显示标记;你有一个预先渲染的热图,显示你的覆盖范围。在更接近的缩放级别,您只需加载正在显示的区域的地图引脚。移动地图后,您将加载更多。

我的意思是Xfinity wifi map。他们在地图上有数十万个点,但从不会一次加载超过几十个标记。快速且易于管理。

答案 1 :(得分:1)

提出是否将1 M记录提取到客户端的问题是一个好主意,并假设它是必要的。了解MySQL客户端协议的工作原理非常重要。有两种模式 - 一种在客户端(STORE_RESULT)中一次存储整个数据集,其中内存分配给整个集合,而另一种模式一次取一行,内存仅分配给当前行(USE_RESULT)。为避免内存问题,客户端需要使用USE_RESULT模式。

有些例子,请看一下:

http://php.net/manual/en/mysqlinfo.concepts.buffering.php

您需要无缓冲的查询。