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');这需要永远的时间来运行。我不确定如何让它更快。
发布于 2012-06-08 14:53:25
你有什么索引?你有l1.Z的索引吗?如果不是,这将是一个显而易见的开始方式。
您还可以将substring(l2.A1,1,5)等表达式的结果存储在表本身中。这将允许您索引表达式的结果,这意味着您的连接将更快。
看起来你也在尝试寻找在太空中“附近”的东西。如果是这样的话,可以看看MySQL spatial extensions。
发布于 2012-06-08 14:56:13
您的数据库的设计在我看来很奇怪,我非常确定MySQL不能对这些条件使用索引
substring(D.A1,1,5) = substring(l2.A1,1,5) and substring(D.A2,1,5) = substring(l2.A2,1,5)今后的糟糕性能:/
发布于 2012-06-08 15:04:52
您应该从使用joins重写查询开始,看看这是否有帮助:
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"https://stackoverflow.com/questions/10944269
复制相似问题