MySQL表有4,000,000条记录?

时间:2011-05-15 17:59:15

标签: php mysql sql geospatial

我必须管理的网站是工作人员的搜索引擎(黄页样式)

我创建了一个这样的数据库:

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; 

我的问题是:

  1. 我的数据库设计得很好吗?我不知道拥有2个表,每个表有4,000,000条记录是不是一个好主意。可以选择它吗?
  2. 我的要求设计得不好吗?
  3. 如何加快搜索速度?

2 个答案:

答案 0 :(得分:4)

  1. 设计看起来规范化了。这是我期望在大多数设计良好的数据库中看到的。表中的数据量很重要,但次要。 然而如果PeopleLocations之间存在一对一的关联,从您的查询中可以看出,我会说表应该是一张桌子。这将当然帮助。

  2. 您的SQL看起来没问题,但添加约束以减少所涉及的行数会有所帮助。

  3. 您需要index your tables。这通常对缓慢有帮助(因为大多数开发人员根本不考虑数据库索引)。

答案 1 :(得分:0)

有一些基本的东西可能会使你的查询运行缓慢。

你桌子上的索引是什么?你在表上声明了主键吗?连接两个表,每个表有4M行而没有索引会导致DB上的大量工作。确保你先做对了。

如果您已经为数据库构建了正确的索引,则可以查看缓存数据。您在查询中进行计算是否位置(纬度/经度)通常是固定的?他们经常变化多久?您所在位置的项目是否是实际位置(城市,建筑物等),还是人们所在位置的记录(如Foursquare签到)?

如果您的位置是位置,那么如果您隔离不经常更改的数据部分并预先计算它们之间的距离,则可以进行很多很好的优化。

如果所有其他方法都失败了,请确保您的数据库服务器有足够的RAM。如果服务器可以将您的数据保存在内存中,则会加快速度。