我有一个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
答案 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来减少结果集还有一个好处,即允许数据库为您做一些优化,这就是您希望如何使用它。