GVKun编程网logo

php – mysql查询中的距离计算(mysql查询长度)

26

对于想了解php–mysql查询中的距离计算的读者,本文将是一篇不可错过的文章,我们将详细介绍mysql查询长度,并且为您提供关于milvus使用l2欧式距离计算向量的距离,计算出来的距离的最大值是多

对于想了解php – mysql查询中的距离计算的读者,本文将是一篇不可错过的文章,我们将详细介绍mysql查询长度,并且为您提供关于milvus 使用 l2 欧式距离计算向量的距离,计算出来的距离的最大值是多少?、mysql-如何在一个sql查询中计算来自多个表的行、MySQL查询中的分页思路的优化_MySQL、mysql查询中的距离计算的有价值信息。

本文目录一览:

php – mysql查询中的距离计算(mysql查询长度)

php – mysql查询中的距离计算(mysql查询长度)

我必须查询数千个条目的数据库,并按指定点的距离对其进行排序.

问题是每个条目都有纬度和经度,我需要检索每个条目来计算它的距离.使用大型数据库,我不想检索每一行,这可能需要一些时间.

有没有办法将其构建到mysql查询中,这样我只需要检索最近的15个条目.

例如.

`SELECT events.id,cacldistance($latlng,events.location) AS distance FROM events ORDER BY distance LIMIT 0,15`

    function cacldistance($old,$new){
       //Calculates the distance between $old and $new
    }

解决方法

选项1:
通过切换到支持GeoIP的数据库对数据库进行计算.

选项2:
使用如下存储过程对数据库进行计算:

CREATE FUNCTION calcdistance (latA double,lonA double,latB double,LonB double)
    RETURNS double DETERMINISTIC
BEGIN
    SET @RlatA = radians(latA);
    SET @RlonA = radians(lonA);
    SET @RlatB = radians(latB);
    SET @RlonB = radians(LonB);
    SET @deltaLat = @RlatA - @RlatB;
    SET @deltaLon = @RlonA - @RlonB;
    SET @d = SIN(@deltaLat/2) * SIN(@deltaLat/2) +
    COS(@RlatA) * COS(@RlatB) * SIN(@deltaLon/2)*SIN(@deltaLon/2);
    RETURN 2 * ASIN(SQRT(@d)) * 6371.01;
END//

如果数据库中有纬度和经度的索引,则可以通过计算PHP中的初始边界框($minLat,$maxLat,$minLong和$maxLong)来减少需要计算的计算次数,并限制行的子行根据(WHERE纬度BETWEEN $minLat和$maxLat以及经度BETWEEN $minLong和$maxLong).然后,MysqL只需要为该行子集执行距离计算.

如果您只是使用存储过程来计算距离),那么sql仍然必须查看数据库中的每条记录,并计算数据库中每条记录的距离,然后才能决定是返回该行还是丢弃该行.

因为计算执行起来相对较慢,所以如果你可以减少需要计算的行集会更好,消除明显超出所需距离的行,这样我们只执行昂贵的计算行数较少.

如果你认为你正在做的事情基本上是在地图上绘制一个圆圈,以你的初始点为中心,并且距离的半径;那么公式只是简单地确定哪些行落在那个圆圈内……但它仍然必须检查每一行.

使用边界框就像在地图上首先绘制一个正方形,左边,右边,顶边和底边与我们的中心点保持适当的距离.然后我们的圆圈将被绘制在该框内,圆圈上的最北端,最东端,最南端和最西端的点接触到框的边界.有些行会落在该框之外,因此sql甚至不愿意尝试计算这些行的距离.它仅计算落在边界框内的那些行的距离,以查看它们是否也在圆圈内.

在你的PHP中(猜测你是从$变量名运行PHP),我们可以使用一个非常简单的计算,根据我们的距离计算最小和最大纬度和经度,然后在sql的WHERE子句中设置这些值声明.这实际上就是我们的盒子,任何不属于它的东西都会被自动丢弃,而不需要实际计算它的距离.

对于计划在PHP中进行任何GeoPositioning工作的任何人来说,在Movable Type website上有一个很好的解释(使用PHP代码).

编辑calcdistance存储过程中的值6371.01是乘数,用于以公里为单位返回返回的结果.如果您想要产生里程,海里,米,等等,请使用适当的替代乘数

milvus 使用 l2 欧式距离计算向量的距离,计算出来的距离的最大值是多少?

milvus 使用 l2 欧式距离计算向量的距离,计算出来的距离的最大值是多少?

Q:milvus 使用 l2 欧式距离计算向量的距离,计算出来的距离的最大值是多少?
A:归一化之后,最大值是4

Q:归一化的是怎么操作的?调用 collection.search 之后获得的向量,已经是归一化了吗?还是需要自己对 milvus 的搜索结果再做归一化?

A:需要自己的对向量做归一化

Q:有样例代码吗
A:可以用np.linalg.norm

Q:归一化是查询之前做,还是获取查询结果后,对距离做归一化?
A:查询之前做,查询的向量,和入底库的向量,都需要做归一化


import numpy as np
import milvus

# 连接 Milvus 服务器
client = milvus.Milvus(host=''localhost'', port=''19530'')

# 定义查询向量
query_vector = np.array([0.1, 0.2, 0.3, 0.4, 0.5], dtype=np.float32)

# 查询向量归一化
query_vector_norm = query_vector / np.linalg.norm(query_vector)

# 构建查询参数
search_param = {
    "metric_type": "L2",
    "params": {"nprobe": 16}
}

# 在 milvus 中查询向量
search_result = client.search(collection_name=''my_collection'', query_records=[query_vector_norm.tolist()], top_k=10, params=search_param)

# 处理查询结果
for result in search_result:
    print(result.id, result.distance)

mysql-如何在一个sql查询中计算来自多个表的行

mysql-如何在一个sql查询中计算来自多个表的行

我有一个问题,必须从多个表中获取行计数.

例如:

SELECT COUNT(*) FROM table1;
SELECT COUNT(*) FROM table1 where condition;
SELECT COUNT(*) FROM table2;
SELECT COUNT(*) FROM table3 where condition;
最佳答案
您可以使用UNION

SELECT COUNT(*) FROM table1
UNION
SELECT COUNT(*) FROM table1 where condition;
UNION
SELECT COUNT(*) FROM table2;
UNION
SELECT COUNT(*) FROM table3 where condition;

您可以添加额外的字段,以通过以下查询找到要获得的行

SELECT "COND-1" AS TITLE,COUNT(*) FROM table1
UNION
SELECT "COND-2" AS TITLE,COUNT(*) FROM table1 where condition;
UNION
SELECT "COND-3" AS TITLE,COUNT(*) FROM table2;
UNION
SELECT "COND-4" AS TITLE,COUNT(*) FROM table3 where condition;

MySQL查询中的分页思路的优化_MySQL

MySQL查询中的分页思路的优化_MySQL

  复杂条件搜索时,where somthing order by somefield+somefieldmysql会搜遍数据库,找出“所有”符合条件的记录,然后取出m,n条记录。如果你的数据量有几十万条,用户又搜索一些很通俗的词,然后要依次读最后几页重温旧梦。mysql该很悲壮的不停操作硬盘。

  所以,可以试着让mysql也存储分页,当然要程序配合。

  ASP的分页:在ASP系统中有Recordset对象来实现分页,但是大量数据放在内存中,而且不知道什么时候才失效(请ASP高手指点). SQL数据库分页:用存储过程+游标方式分页,具体实现原理不是很清楚,设想如果用一次查询就得到需要的结果,或者是id集,需要后续页时只要按照结果中的IDs读出相关记录。这样只要很小的空间保留本次查询的所有IDs. (SQL中的查询结果不知道怎样清楚过期垃圾?)

  这样,可以让mysql模拟存储分页机制:1. select id from $table where $condition order by $field limit $max_pages*$count;查询符合条件的IDs.限定最大符合条件的记录数量,也可以不加。2. 因为php在执行结束后所有变量都要lost,所以可以考虑:方案a. 在mysql建立临时表,查询结果用一个时间或随机数作为唯一标志插入。其中建立page1~pagen个字段,每个字段保存该页中需要的ids, 这样一个id对一条记录.方案b. 如果打开session,也可以放在session中保存,实际上是放在文件中保存。建立一个$IDs数组,$IDs[1]~$IDs[$max_pages]. 考虑到有时候用户会开几个窗口同时查询,要为$ids做一个唯一标志,避免查询结果相互覆盖。二维数组和$$var都是好办法。3. 在每页页的请求中,直接找到对应的IDs,中间以","间隔:select * from $table where id in ($ids); 速度绝对快4. 收尾要考虑查询结果的自动清除,可以设置定时或者按比例随机清楚。如果用mysql临时表要加上一个时间标志字段,session中要加入$IDs["time"]=time(); 在一定时间以后不操作视为过期数据。

  如果要优化,可以考虑用把1和2.a中的语句合并成select ...... into ....

  Note:1.以上只是针对mysql的修补方案,希望mysql哪天能把这些功能加进去2.其它数据库也可以套用。3.如果其它数据库还有更先进的分页方式,请告诉我或mailto: steeven@kali.com.cn4.如果真的有很多数据要查询,还是和mysql再见吧,sql,oracle都提供了更先进的关键词索引查询。

mysql查询中的距离计算

mysql查询中的距离计算

我必须查询成千上万个条目的数据库,并按距指定点的距离对其进行排序。

问题是每个条目都有一个纬度和经度,我需要检索每个条目以计算其距离。对于大型数据库,我不想检索每一行,这可能需要一些时间。

有什么办法可以将其构建到mysql查询中,以便我只需要检索最近的15个条目。

例如

`SELECT events.id,caclDistance($latlng,events.location) AS distance FROM events ORDER BY distance LIMIT 0,15`

    function caclDistance($old,$new){
       //Calculates the distance between $old and $new
    }

关于php – mysql查询中的距离计算mysql查询长度的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于milvus 使用 l2 欧式距离计算向量的距离,计算出来的距离的最大值是多少?、mysql-如何在一个sql查询中计算来自多个表的行、MySQL查询中的分页思路的优化_MySQL、mysql查询中的距离计算的相关信息,请在本站寻找。

本文标签: