Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 大型数据库站点,需要帮助加快查询速度_Sql - Fatal编程技术网

Sql 大型数据库站点,需要帮助加快查询速度

Sql 大型数据库站点,需要帮助加快查询速度,sql,Sql,必须有一种更快的方法来获得结果。这在我的小数据库中效果很好,但在我的大数据库(2000万行)中,这个过程需要永远。我曾尝试为lat和lon列创建索引,但确实有所帮助。除了硬件升级,还有什么方法可以加快速度吗??目前,它正在获取一组跳线,并将其与数据库中的每一行进行比较。我将结果限制为10个 $sql = sprintf("SELECT lat, lon, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( r

必须有一种更快的方法来获得结果。这在我的小数据库中效果很好,但在我的大数据库(2000万行)中,这个过程需要永远。我曾尝试为lat和lon列创建索引,但确实有所帮助。除了硬件升级,还有什么方法可以加快速度吗??目前,它正在获取一组跳线,并将其与数据库中的每一行进行比较。我将结果限制为10个

$sql = sprintf("SELECT lat, lon, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos(    radians( lon ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM $tbl_name HAVING distance < '%s' ORDER BY distance LIMIT $start, $limit",

     mysql_real_escape_string($lat),

     mysql_real_escape_string($lon),

     mysql_real_escape_string($lat),

     mysql_real_escape_string($radius));

$result = mysql_query($sql);


while($row = @mysql_fetch_assoc($result)) {

echo oresults....

}
$sql=sprintf(“选择lat,lon,(3959*acos(弧度('%s'))*cos(弧度(lat))*cos(弧度(lon)-弧度('%s'))+sin(弧度('%s'))*sin(弧度(lat)))作为距离$tbl_名称的距离,该名称的距离<'%s'顺序按距离限制$start,$LIMIT排列,”,
mysql\u real\u escape\u字符串($lat),
mysql_real_escape_字符串($lon),
mysql\u real\u escape\u字符串($lat),
mysql_real_escape_字符串($radius));
$result=mysql\u查询($sql);
while($row=@mysql\u fetch\u assoc($result)){
呼应结果。。。。
}
谢谢,
布赖恩

我要做的第一件事就是把一张三角桌用蜡膏粘起来

Create table TrigVals (
   Radians decimal(18,15) primary Key Not null,
   Sin decimal(18,17) not null,
   Cos decimal(18,17) not null)
然后在sin和cos列上创建两个额外的唯一索引,用于反向查找(arcin和arcos函数)

根据所需的值范围填充此表(纬度,0到π/2;经度,0到π)


然后在查询中加入这些表,而不是对从数据库中检索到的每一行执行实际的数学触发函数。

这只是一个无中生有的尝试,但也许可以通过将数据范围限制为可能位于距离圆中的纬度和经度来减少计算次数

比如:

$MinLatitude = $User_Latitude - $Distance
$MaxLatitude = $User_Latitude + $Distance
$MinLongitude = $User_Longitude - $Distance
$MaxLongitude = $User_Longitude + $Distance
然后,可以向SQL语句中添加WHERE子句以减少计算次数:

WHERE $MinLatitude <= lat AND lat <= $MaxLatitude
    AND $MinLongitude <= lon AND lon <= $MaxLongitude

WHERE$minlation如果您在程序中使用此SQL,则应将数据拉入ram并在程序中进行计算。它正在网站上使用。我知道服务器上有memcached,但我不知道如何用DB设置它。但我想我需要研究一下。这是什么SQL产品?所以我还不太擅长SQL。但是,如果我用来与DB进行比较的值的范围总是在变化,那么这种方法有效吗?如果你不介意深入了解更多的细节或链接,那就太好了。