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');
这需要永远运行。我不知道如何更快地做到这一点。
答案 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
我没有足够的关于表的信息,例如字段类型,行数,键和索引
更新格式