我正在使用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标准列表填写国家和地区表格,以及城市表格的免费城市数据库。
答案 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怎么样:
尝试在countryid
/ regionid
和asciName
/ isoName
上添加索引(无论哪个用于自动填充结果)
不要将LIKE "%new york%"
用于自动填充查询,因为这种形式MySQL不能使用VARCHAR索引。你必须在它前面没有百分比字符的情况下运行它:"new york%"
。
您可以隐藏城市输入字段,直到用户选择国家/地区 - 这样您就可以限制countryid
/ regionid
字段的自动填充查询(并使用其索引)。
自动完成输入的时间仅在自输入上一个字符后经过1秒(或左右)后发送查询。