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

时间:2010-06-21 22:24:23

标签: mysql query-optimization

我有一个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;

我运行了一个EXPLAIN SELECT ...生成了

  

id | select_type |表|类型|   possible_keys |关键| key_len | ref |   行|额外

     

1 SIMPLE myTable ALL NULL NULL NULL NULL 137003使用where

有没有办法优化在数据库中的每个纬度和经度上运行的查询,或者这是否与它一样好?

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

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

谢谢,

Laxmidi

2 个答案:

答案 0 :(得分:1)

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

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;

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

答案 1 :(得分:0)

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

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

  • 使功能更快,使你仍然运行137k次,但每次调用花费的时间更少,从而减少了总运行时间。

现在你的函数每行运行0.1459毫秒,这真的不错。您可能想要尝试找到一些方法来进一步减少运行它的行数。通过巧妙使用WHERE来减少结果集还有一个好处,即允许数据库为您做一些优化,这就是您希望如何使用它。