javascript - 将大查询拆分为谷歌地图

标签 javascript php mysql google-maps-api-3

我有一个包含超过一百万个位置的表

  • 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/

相关文章:

javascript - 使 Mithril 应用程序 SEO 友好

php - 使用 MySQLi 时在非对象上调用成员函数 real_escape_string()

php - 声云声波

php - 通过 PHP 更改 URL

javascript - 无法将变量作为 onClick 函数中的参数传递

javascript - 在 Chrome 扩展中抓取 DOM 值

javascript - onclick=改变表单中所有输入框的同一个类的背景颜色

mySQL 删除 w/join 或子查询

mysql - crontab显示mysql错误

mysql - 如何从表中选择不同的行并将所选行连接到 mysql 中的另一个表