0
SELECT D.A1, D.A2, D.A3  from D, l1
     ,l2 where
     l1.Z = "90001"and substring(D.A1,1,5) = substring(l2.A1,1,5) and substring(D.A2,1,5) = substring(l2.A2,1,5)
    AND 3959 * (PI()/180) * SQRT(
        POW( (l2.A2-l1.A2)*COS((PI()/180)*(l2.A1+l2.A1)/2), 2 ) + 
         POW( l2.A1-l1.A1, 2 ) ) <= 10');

这需要永远运行。我不知道如何使这更快。

4

4 回答 4

0

coll_cs,你可以试试这个

select D1.A1, D1.A2, D1.A3
     from 
     ( 
        SELECT substring(D.A1,1,5) AS A1,
                substring(D.A2,1,5) AS A2,
                D.D3 AS D3
        from D
     ) as D1
     ,
     (
        select 
        substring(l2.A1,1,5) AS A1,
        substring(l2.A2,1,5) AS A2
        l1,l2
        where l1.Z = "90001"
        and
        3959 * 
        (PI()/180) * 
        SQRT(
        POW( (l2.A2-l1.A2)*COS((PI()/180)*(l2.A1+l2.A1)/2), 2 ) + 
        POW( l2.A1-l1.A1, 2 ) 
        ) <= 10
     ) as L
     where D1 = L.A1
     and   D1 = L.A2

我没有关于表的足够信息,例如字段类型、行数、键和索引

更新格式

于 2012-06-08T07:50:23.560 回答
0

你有什么索引?你有索引l1.Z吗?如果没有,这将是一个明显的开始方式。

您还可以将表达式的结果存储substring(l2.A1,1,5)在表本身中。这将允许您索引表达式的结果,这意味着您的连接会更快。

看起来您还试图在太空中寻找“附近”的东西。如果是这样,请查看 MySQLs空间扩展

于 2012-06-08T06:53:24.887 回答
0

你的数据库设计对我来说看起来很奇怪,我很确定 MySQL 不能在这些条件下使用 INDEX

substring(D.A1,1,5) = substring(l2.A1,1,5) and substring(D.A2,1,5) = substring(l2.A2,1,5)

从此以后表现不佳:/

于 2012-06-08T06:56:12.910 回答
0

您应该首先使用连接重写查询,看看是否有帮助:

select D.A1, D.A2, D.A3
from D
inner join l2 on substring(D.A1,1,5) = substring(l2.A1,1,5) and substring(D.A2,1,5) = substring(l2.A2,1,5)
inner join l1 on 3959 * (PI()/180) * SQRT( POW( (l2.A2-l1.A2)*COS((PI()/180)*(l2.A1+l2.A1)/2), 2 ) + POW( l2.A1-l1.A1, 2 ) ) <= 10
where l1.Z = "90001"
于 2012-06-08T07:04:51.603 回答