我有一个包含超过一百万个位置的表
- ID
- 地址
- 经度
- 纬度
用户可以输入地址,然后在谷歌地图中获取半径为 5 公里的最近位置。
我的选择查询:
$result = mysql_query("SELECT *, ( 6371 * acos( cos( radians(".$lat1.") ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(".$lng1.") ) + sin( radians(".$lat1.") ) * sin( radians( lat ) ) ) ) AS distance FROM star HAVING distance < ".$rad." ORDER BY distance");
结果在表中,在 javascript <>
while ($row = mysql_fetch_array($result)) {
echo "
var marker".$row{'id'}." = new google.maps.Marker({
position: new google.maps.LatLng(".$row{'lat'}." , ".$row{'lng'}."),
map: map
});
var infowindow".$row{'id'}." = new google.maps.InfoWindow({
content: 'City : ".$row{'city'}.", Address : ".$row{'address'}." , Lat : ".$row{'lat'}." , Lng : ".$row{'lng'}."'
});
google.maps.event.addListener(marker".$row{'id'}.", 'click', function() {
infowindow".$row{'id'}.".open(map, marker".$row{'id'}.");
});
";
}
我的问题是当它超过 10 个位置时,它不显示谷歌地图。我不想使用 LIMIT 0,10,我想显示所有结果。
如何拆分查询以每次从大表中搜索 10%?
类似于在页面加载后将标记置于运行时。
最佳答案
感谢您的澄清。这是我编辑过的答案。
问题似乎是您需要一种有效的方法将查询结果分解为更小的部分,而不必重新查询数据库。在您提供的示例中,基于位置的查询将生成包含 10,000 个结果的列表,您希望将其结果进一步分割为 10 个 block ,每个 block 1,000 个,而无需返回数据库。我认为这是因为返回 10,000 个结果的原始查询一开始就很慢,而一次查询 1,000 个结果也同样慢。
此问题有多种潜在的解决方案,您选择哪一种取决于数据在应用程序中的使用方式。此查询对于您的应用程序的单个用户来说是唯一的,还是由数十、数百或数千个用户使用的不同变体?
如果应用程序的所有用户都使用相同的查询,那么我会使用 cron 作业将整个查询的结果选择到(准)临时表中。该表仅用于存储缓存数据。当您一次翻阅 1,000 个结果时,您将查询缓存的表。这会快得多,因为所有距离都会预先计算,并且您不必再次运行半正弦公式。
如果应用程序的所有用户都使用同一查询的多个变体,您还可以将查询的整个结果作为序列化数组存储在用户 session 中。然后,每次您需要检查结果(一次 1,000 个)时,您都会从 session 中存储的有序数组中读取,并生成适当的结果。
如果您在整个应用程序中面临此查询的数千或数百万种变体,那么使其更快的最佳方法是重新考虑数据的存储方式/位置,和/或如何存储数据。访问它。我知道这个选择在短期内可能不可行,但有时需要这样的改变才能产生效率的巨大变化。我希望这会有所帮助!
关于javascript - 将大查询拆分为谷歌地图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18767057/