国家,地区,城市的登记表 - 如何管理200万条mySQL记录?

时间:2010-11-08 10:55:30

标签: php jquery mysql ajax codeigniter

我正在使用PHP框架CodeIgniter创建一个Web应用程序。该应用程序依赖于有关用户所在国家,地区和城市的正确信息。

我目前有一个注册表单,其中包含一个国家/地区下拉框(填充数据库),一个区域下拉框(使用ajax根据国家/地区填充)和一个城市下拉框(根据国家和地区使用ajax进行jquery自动完成) )。

我的问题是城市数据库有超过200万条目,而且自动完成的速度相当慢。我在其他地方看到过这种事情,例如。 Facebook事件自动完成位置的速度要快得多。

我的问题是,有什么方法可以加快这个过程(优化mySQL数据库,ajax调用)以使其更快,还是有其他方法可以使用Google Maps API这样做?

赞赏任何意见/评论/想法。

以下是我的表格的基本定义:

City:
countryid, char(2)
country, varchar(100)

Region:
countryid, char(2)
regionid, varchar(2)
regionName, varchar(50)

City:
cityid, int
countryid, char(2)
regionid, varchar(2)
asciName, varchar(100)
isoName, varchar(200)
population, int
long, float
lat, float

我使用ISO标准列表填写国家和地区表格,以及城市表格的免费城市数据库。

2 个答案:

答案 0 :(得分:2)

我会使用www.geonames.org,它返回json的数据。

样本用法:

http://ws.geonames.org/searchJSON?name_startsWith=San&country=US

返回:

{"totalResultsCount":12101,"geonames":[{"countryName":"United States","adminCode1":"AL","fclName":"city, ....

无需从您自己的数据库中提取此类数据。

答案 1 :(得分:0)

City table怎么样:

  1. 尝试在countryid / regionidasciName / isoName上添加索引(无论哪个用于自动填充结果)

  2. 不要将LIKE "%new york%"用于自动填充查询,因为这种形式MySQL不能使用VARCHAR索引。你必须在它前面没有百分比字符的情况下运行它:"new york%"

  3. 您可以隐藏城市输入字段,直到用户选择国家/地区 - 这样您就可以限制countryid / regionid字段的自动填充查询(并使用其索引)。

  4. 自动完成输入的时间仅在自输入上一个字符后经过1秒(或左右)后发送查询。