当前位置: 首页 > 面试题库 >

基于慢速位置的搜索结果查询

窦华晖
2023-03-14
问题内容

我有一个查询,用于查找按位置排序的结果。结果还必须考虑增值税,因此这也在查询中。不幸的是,该查询在未缓存时可能需要4秒钟以上的时间才能运行。谁能发现任何明显的问题或建议我做些什么来改善它?

只是为了澄清查询中正在发生的事情:

  • 计算的距离是使用经/纬度的欧几里得距离
  • 当包含增值税时,incvat字段用于显示价格
  • WHEN / THEN语句用于将价格0置于最底端

查询:

SELECT * , ROUND( SQRT( POW( ( 69.1 * ( company_branch_lat - 52.4862 ) ) , 2 ) + POW( ( 53 * ( company_branch_lng - - 1.8905 ) ) , 2 ) ) , 1 ) AS distance, 
    hire_car_day + ( hire_car_day * 0.2 * ! hire_car_incvat ) AS hire_car_day_incvat, 
    hire_car_addday + ( hire_car_addday * 0.2 * ! hire_car_incvat ) AS hire_car_addday_incvat, 
    hire_car_week + ( hire_car_week * 0.2 * ! hire_car_incvat ) AS hire_car_week_incvat, 
    hire_car_weekend + ( hire_car_weekend * 0.2 * ! hire_car_incvat ) AS hire_car_weekend_incvat
FROM hire_car
LEFT JOIN company_branch ON company_branch_id = hire_car_branchid
LEFT JOIN hire_cartypelink ON hire_cartypelink_carhireid = hire_car_id
LEFT JOIN users ON company_branch_userid = user_id
WHERE 1 
GROUP BY hire_car_id
HAVING distance <=30
ORDER BY CASE hire_car_day_incvat
WHEN 0 
THEN 40000 
ELSE hire_car_day_incvat
END , distance ASC 
LIMIT 0 , 30

问题答案:

您可以使用mysql空间扩展并将纬度和经度保存为点数据类型,并使其成为空间索引。这样,您可以沿曲线对坐标进行重新排序并减小尺寸并保留空间信息。您可以使用空间索引作为边界框来过滤查询,然后使用harvesine公式选择最佳结果。您的边界框应大于大圆的半径。Mysql使用带有一些空间索引的rtree,而我的示例是关于z曲线或希尔伯特曲线的:https
://softwareengineering.stackexchange.com/questions/113256/what-is-the-
difference-between-btree-and-
rtree-索引。然后,您可以将地理坐标直接插入到点列中:http : //dev.mysql.com/doc/refman/5.0/en/creating-spatial-
values.html。或者,您可以使用几何数据类型:http : //markmaunder.com/2009/10/10/mysql-gis-
extensions-quick-start/。然后,您可以像这样使用MBRcontains函数:http ://dev.mysql.com/doc/refman/4.1/en/relations-on-
geometry-
mbr.html或任何其他函数:http ://dev.mysql.com
/doc/refman/5.5/zh-CN/functions-for-testing-spatial-relations-between-
geometric-objects.html。因此,您需要一个边界框。这里有些例子:


  • 使用空间点类型在MySQL中存储Lat Lng值
  • https://gis.stackexchange.com/questions/28333/how-to-speed-up-this-simple-mysql-points-in-the-box-query

这是一个具有点数据类型的简单示例:

    CREATE SPATIAL INDEX sx_place_location ON place (location)

    SELECT  * FROM    mytable
    WHERE   MBRContains
           (
           LineString
                   (
                   Point($x - $radius, $y - $radius),
                   Point($x + $radius, $y + $radius)
                   )
           location
           )
    AND Distance(Point($x, $y), location) <= $radius
  • MySQL纬度和经度表设置。

我不确定它是否有效,因为它使用的是带有定界框功能的radius变量。在我看来,MBRwithin有点简单,因为它不需要任何参数:Mysql:优化在嵌套集合树中查找超级节点。



 类似资料:
  • 这是我想解决的问题: 我有多个Lucene索引,每个索引包含相同数据结构的子集(它们具有相同的字段,但是字段可能存在于文档中,也可能不存在于某个索引中) 索引之间共享一个全局标识符。也就是说,如果有4个索引,最多可能有4个文档共享一个密钥。 我有一个单一的Lucene查询 我使用一起查询所有索引,并且我能够使用找出命中来自哪个子索引。到目前为止还不错,但问题是: 为了执行一个(相当复杂的)合并逻辑

  • 我使用的是spring data elasticsearch,当我使用@query注释时,将代码与实际的JSON elasticsearch查询关联起来要容易得多,如本链接参考中的示例所示: https://www.programcreek.com/java-api-examples/index.php?api=org.springframework.data.elasticsearch.anno

  • 我们看到缓慢/阻塞 我已经启用了一个慢速操作检测器来记录耗时超过1秒的慢速操作。运行搜索时未检测到慢速操作,因此服务器端的查询执行速度应该更快。 将客户端套接字缓冲区大小从32 kb增加到1024 kb。性能没有改善 我正在使用Hazelcast便携式序列化。Hazelcast版本3.11。 我正在使用IMap。getAll以获取多个对象。Hazelcast慢速运行检测器能够检测耗时超过1秒的查询

  • 我正在开发JSF项目并将Elastic Search与本机JavaApi(不是Jest)一起使用。我在elasticsearch索引映射中为高级全文搜索定义了分析器和nGram过滤器。如何使用java api进行此查询定义?

  • 我目前正在参与使用Liferay(6.1 GA2)的项目。Liferay搜索结果似乎提供了指向Web内容片段的链接,而不是指向包含这些片段的页面的链接。 你们中有人经历过这个问题吗?你知道怎么解决吗? 非常感谢朋友们。 最好的,阿尔贝托

  • 我对弹性搜索完全陌生。我在试着从弹性搜索中取记录。 我查了文件,但找不到任何解决办法。如果你在这里给我一些提示或一些网站,我可以解决我的问题,我将非常感谢。