如何更快地进行此查询

时间:2012-06-08 06:51:27

标签: mysql sql

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 个答案:

答案 0 :(得分:0)

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

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

看起来你也想找到太空中“附近”的东西。如果是这样,请查看MySQL spatial extensions

答案 1 :(得分:0)

您的数据库设计对我来说很奇怪,我很确定MySQL不能将INDEX与这些条件一起使用

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

此后表现不佳:/

答案 2 :(得分: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"

答案 3 :(得分: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

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

更新格式