有没有办法优化在每一行上运行函数的MySQL查询?

有没有办法优化在每一行上运行函数的MySQL查询?,mysql,query-optimization,Mysql,Query Optimization,我有一个MySQL查询,它根据一个标准从数据库中提取lat long,测试这些点是否在多边形内,并返回多边形内的点 一切正常。问题是查询大约需要20秒才能返回结果。有没有一种方法可以优化此查询,从而使查询速度更快 SELECT latitude, longitude FROM myTable WHERE offense = 'green' AND myWithin( POINTFROMTEXT( CONCAT( 'POINT(', latitude, ' ', longitude, ')' )

我有一个MySQL查询,它根据一个标准从数据库中提取lat long,测试这些点是否在多边形内,并返回多边形内的点

一切正常。问题是查询大约需要20秒才能返回结果。有没有一种方法可以优化此查询,从而使查询速度更快

SELECT latitude, longitude
FROM myTable
WHERE offense = 'green' AND myWithin(
POINTFROMTEXT( CONCAT( 'POINT(', latitude, ' ', longitude, ')' ) ) , POLYFROMTEXT( 'POLYGON(( ...bunch of lat longs...))' )
) = 1;
我运行了一个解释选择。。。产生

id |选择|类型|表格|类型| 可能的|键|键|列|参考| 行|额外

1简单myTable ALL NULL 137003使用where

有没有一种方法可以优化在数据库中的每个纬度和经度上运行的查询,或者这是最好的方法

我正在考虑对另一个表进行选择,然后查询结果表,但我希望有一种方法可以提高此查询的性能

如果有人有任何建议或想法,我很乐意听听

谢谢


Laxmidi

我看到了两个明显的优化途径:

  • 在运行函数O(n)次之前,请进一步减少结果集。现在,您正在运行函数137003次-如果您不能进一步过滤结果集,那么几乎没有办法避免这种情况

  • 使函数更快,这样您仍然可以运行137k次,但每次调用所需的时间更少,从而减少总运行时间


现在,您的函数每行运行0.1459毫秒,这真的不错。您可能希望找到某种方法来进一步减少必须运行它的行数。通过巧妙地使用WHERE来减少结果集还有一个好处,那就是允许您的数据库为您进行一些优化,这就是您希望使用它的方式。

多边形有多大?可以围绕整个多边形定义一个“边界矩形”,然后执行以下操作:

SELECT latitude, longitude
FROM myTable
WHERE
  offense = 'green' AND
  latitude BETWEEN rect_left AND rect_right AND
  longitude BETWEEN rect_top AND rect_bottom AND
  myWithin(
    POINTFROMTEXT( CONCAT( 'POINT(', latitude, ' ', longitude, ')' ) ),
    POLYFROMTEXT( 'POLYGON(( ...bunch of lat longs...))' )) = 1;

这样,它就可以使用纬度和经度的索引来缩小运行复杂内容所需的点的数量。

Hi codeka,多边形是邻域。它们的形状是不规则的。有没有办法运行MBR和MyInner函数?据我所知,MBR给出了误报。它会给出错误的否定吗?如果不是,也许这就是一个解决办法。如果有一种方法可以将mbracontains与myWithin函数配合使用,那么我就可以避免为每个邻域添加用于边界矩形的列。我喜欢听你的想法。我认为“边界矩形”是个好主意。你不应该为边界矩形添加列,它很容易计算。只需取你的“一堆纬度”,计算出最小和最大纬度——分别是“左直”和“右直”。“横向长度束”的最小和最大经度分别为“垂直底部”和“垂直顶部”。在运行查询之前,您只需计算一下即可。嗨,Dean,谢谢您的留言。很好。我没想到。问题解决了。非常感谢。嗨,尼克,谢谢你的留言。我很高兴我的功能运行得相当快。我必须努力减少函数必须运行的次数。我真的很感谢你的帮助。