内容简介:想要不拖垮数据,要做到能走索引。就是跟你无关的点,不要扫描。减少扫描行数来实现减轻数据库的压力。那么减少扫描行数肯定要想到索引。可是经纬度有两个字段,且查询条件无论怎么写都没办法走索引。那么唯一能想到的就是二维变一维。 geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码,这种方式简单粗暴,可以满足对小规模的数据进行经纬度的检索。如图,当前缀码相同为7相差76米左右,为8相差19米,为9的话可以近似理解为那个人就在你身边了。
前言
附近的人 ,这四个字的需求就大有文章可做了。很二逼的做法是,存每个人的经度纬度,然后遍历数据库所有数据,foreach循环,两点距离坐标公式。量少的时候,这个没啥问题。量大了,扫描全表 + 经纬度距离运算分分钟拖垮数据库。那么是否有方案可以解决这个痛点呢,今年就来说下 Geohash
实现思路
想要不拖垮数据,要做到能走索引。就是跟你无关的点,不要扫描。减少扫描行数来实现减轻数据库的压力。那么减少扫描行数肯定要想到索引。可是经纬度有两个字段,且查询条件无论怎么写都没办法走索引。那么唯一能想到的就是二维变一维。 geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码,这种方式简单粗暴,可以满足对小规模的数据进行经纬度的检索。 两个点的距离越近,他们的编码前缀部分就相同,前缀部分相同越多,代表距离越近 。然后我们做数据库扫描的时候 可以 WHERE geohash Like 'code%' 这样就起到了走索引从而优化了执行效率。
代码思路(PHP)
class Geohash {
private $coding = "0123456789bcdefghjkmnpqrstuvwxyz";
private $codingMap = array();
public function Geohash() {
for($i = 0; $i < 32; $i++) {
$this->codingMap[substr($this->coding, $i, 1)] = str_pad(decbin($i), 5, "0", STR_PAD_LEFT);
}
}
public function decode($hash) {
$binary = "";
$hl = strlen($hash);
for($i = 0; $i < $hl; $i++) {
$binary .= $this->codingMap[substr($hash, $i, 1)];
}
$bl = strlen($binary);
$blat = "";
$blong = "";
for ($i = 0; $i < $bl; $i++) {
if ($i%2) {
$blat = $blat.substr($binary, $i, 1);
} else {
$blong = $blong.substr($binary, $i, 1);
}
}
$lat = $this->binDecode($blat, -90, 90);
$long = $this->binDecode($blong, -180, 180);
$latErr = $this->calcError(strlen($blat), -90, 90);
$longErr = $this->calcError(strlen($blong), -180, 180);
$latPlaces = max(1, -round(log10($latErr))) - 1;
$longPlaces = max(1, -round(log10($longErr))) - 1;
$lat = round($lat, $latPlaces);
$long = round($long, $longPlaces);
return array($lat,$long);
}
public function encode($lat,$long) {
$plat = $this->precision($lat);
$latbits = 1;
$err = 45;
while($err > $plat) {
$latbits++;
$err/ = 2;
}
$plong = $this->precision($long);
$longbits = 1;
$err = 90;
while($err > $plong) {
$longbits++;
$err /= 2;
}
$bits = max($latbits,$longbits);
$longbits = $bits;
$latbits = $bits;
$addlong = 1;
while (($longbits+$latbits) % 5 != 0) {
$longbits += $addlong;
$latbits += !$addlong;
$addlong = !$addlong;
}
$blat = $this->binEncode($lat, -90, 90, $latbits);
$blong = $this->binEncode($long, -180, 180, $longbits);
$binary = "";
$uselong = 1;
while (strlen($blat)+strlen($blong)) {
if ($uselong) {
$binary = $binary.substr($blong, 0, 1);
$blong = substr($blong, 1);
} else {
$binary = $binary.substr($blat, 0, 1);
$blat = substr($blat, 1);
}
$uselong = !$uselong;
}
$hash = "";
for ($i = 0; $i < strlen($binary); $i += 5) {
$n = bindec(substr($binary, $i, 5));
$hash = $hash . $this->coding[$n];
}
return $hash;
}
private function calcError($bits, $min, $max) {
$err = ($max - $min) / 2;
while ($bits--) {
$err /= 2;
}
return $err;
}
private function precision($number) {
$precision = 0;
$pt = strpos($number,'.');
if ($pt! == false) {
$precision = -(strlen($number) - $pt - 1);
}
return pow(10, $precision) / 2;
}
private function binEncode($number, $min, $max, $bitcount) {
if ($bitcount == 0) {
return "";
}
$mid = ($min + $max) / 2;
if ($number > $mid) {
return "1" . $this->binEncode($number, $mid, $max, $bitcount - 1);
} else {
return "0" . $this->binEncode($number, $min, $mid, $bitcount - 1);
}
}
private function binDecode($binary, $min, $max) {
$mid = ($min + $max) / 2;
if (strlen($binary) == 0) {
return $mid;
}
$bit = substr($binary, 0, 1);
$binary = substr($binary, 1);
if ($bit == 1) {
return $this->binDecode($binary, $mid, $max);
} else {
return $this->binDecode($binary, $min, $mid);
}
}
}
精度值
如图,当前缀码相同为7相差76米左右,为8相差19米,为9的话可以近似理解为那个人就在你身边了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 大话业务场景与解决方案-做任务
- iOS中多倒计时场景的解决方案
- 分布式场景下Session解决方案-SpringSession
- 分布式场景下基于重试机制的一致性解决方案
- 分布式场景下基于重试机制的一致性解决方案
- 面试官逼疯面试者:聊聊多进程场景下 Logging 的解决方案?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
网站重构(第3版)
[美] Jeffrey Zeldman、[美] Ethan Marcotte / 傅捷、祝军、李宏 / 电子工业出版社 / 2011-3 / 59.00元
《网站重构:应用Web标准进行设计(第3版)》内容简介:畅销书作家、设计师、网页标准教父jeffrey zeldman再次更新了他经典的、颠覆行业的指南书。这已经是《网站重构:应用Web标准进行设计(第3版)》的第3版了,此次更新基本涵盖了随着环境和技术的变化,web标准所面临的挑战以及因此而发生的改善。第3版让基于标准的设计思想更加清晰,更加易于理解,帮助你在这个领域中保持聪明和领先。 ......一起来看看 《网站重构(第3版)》 这本书的介绍吧!