【发布时间】:2015-10-21 10:16:24
【问题描述】:
我想查找位置在 5 英里以下且具有与我相同标签的用户。
我的数据结构:
UserTable
--------------------------------------
userid | name | lat | long | address
--------------------------------------
101 | xyz | 92 | 72 | NY
201 | HYS | 48 | 56 | JAMAICA
301 | LMN | 92 | 75 | Brazil
TagTable
---------------------
id | userid | tagid
---------------------
1 | 101 | 5
2 | 201 | 7
3 | 301 | 5
查询:
SELECT vb.userid,
vb.address,
( 6371 * ACOS( COS( RADIANS( 28.684342 ) )
* COS( RADIANS( vb.lat ) )
* COS( RADIANS( vb.long) - RADIANS( 77.137941 ) )
+ SIN( RADIANS( 28.684342 ) )
* SIN( RADIANS( vb.lat) )
)
) AS distance
FROM UserTable vb, TagTable vk
WHERE vk.userid = vb.userid
AND vk.tagid = '5'
GROUP BY vk.userid
HAVING distance < 10
ORDER BY distance;
上面的查询占用了很多时间,请帮我找到这个场景下最快的查询。
【问题讨论】:
-
使用 sql 索引更快地处理查询..
-
现在写它需要 11.00 秒后索引它需要 10.00 秒没有边际差异
-
在索引之前需要 11.000 秒,在 tagid 和 userid 上应用索引之后需要 10.000 秒。我希望这个查询在 1-2 秒内执行
-
你在两张桌子上都应用了它吗..
-
在UserTable中的userid是主要字段,并在lat long上应用了索引
标签: mysql sql oracle query-performance