我必须管理的网站是工作人员的搜索引擎(黄页样式)
我创建了一个这样的数据库:
People: <---- 4,000,000 records
id
name
address
id_activity <--- linked to the activites table
tel
fax
id_region <--- linked to the regions table
activites: <---- 1500 activites
id
name_activity
regions: <--- 95 regions
id
region_name
locations: <---- 4,000,000 records
id_people
lat
lon
所以基本上我遇到问题的要求就是选择一个城市周围的所有“工人”(由用户选择)
我创建的请求完全正常,但需要5-6秒才能返回结果......
基本上我在桌子位置做一个选择,选择一定范围内的所有城市,然后加入人员表
SELECT people.*,id, lat, lng, poi,
(6371 * acos(cos(radians(plat)) * cos(radians(lat)) * cos(radians(lng) - radians(plon)) + sin(radians(plat)) * sin(radians(lat)))) AS distance
FROM locations,
people
WHERE locations.id = people.id
HAVING distance < dist
ORDER BY distance LIMIT 0 , 20;
我的问题是:
答案 0 :(得分:4)
设计看起来规范化了。这是我期望在大多数设计良好的数据库中看到的。表中的数据量很重要,但次要。 然而如果People
和Locations
之间存在一对一的关联,从您的查询中可以看出,我会说表应该是一张桌子。这将当然帮助。
您的SQL看起来没问题,但添加约束以减少所涉及的行数会有所帮助。
您需要index your tables。这通常对缓慢有帮助(因为大多数开发人员根本不考虑数据库索引)。
答案 1 :(得分:0)
有一些基本的东西可能会使你的查询运行缓慢。
你桌子上的索引是什么?你在表上声明了主键吗?连接两个表,每个表有4M行而没有索引会导致DB上的大量工作。确保你先做对了。
如果您已经为数据库构建了正确的索引,则可以查看缓存数据。您在查询中进行计算是否位置(纬度/经度)通常是固定的?他们经常变化多久?您所在位置的项目是否是实际位置(城市,建筑物等),还是人们所在位置的记录(如Foursquare签到)?
如果您的位置是位置,那么如果您隔离不经常更改的数据部分并预先计算它们之间的距离,则可以进行很多很好的优化。
如果所有其他方法都失败了,请确保您的数据库服务器有足够的RAM。如果服务器可以将您的数据保存在内存中,则会加快速度。