2010-11-08 19 views
1

我正在使用PHP框架CodeIgniter創建一個Web應用程序。該應用程序依賴於有關用戶的國家,地區和城市的正確信息。國家,地區,城市註冊表 - 如何管理200萬個mySQL記錄?

我目前有一個國家下拉框(從數據庫填充),一個區域下拉框(填充使用ajax取決於國家)和一個城市下拉框(jQuery自動完成使用ajax取決於國家和地區地區)。

我的問題是城市數據庫有超過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標準的列表,以填補國家和地區的表,並可以自由使用的城市數據庫爲城市表。

+3

表中是否有任何索引?你有沒有用'EXPLAIN'運行你的查詢?你能提供查詢嗎? – Gordon 2010-11-08 10:58:44

+1

你確定這是最方便的方法嗎?難道讓用戶進入他們的城市並在文本字段中停用幾秒鐘後顯示所有匹配的選項不是嗎?我發現地區/城市下降非常繁瑣 – 2010-11-08 11:06:34

+0

在這個世界上有4360個城市。不知道你從哪裏得到200萬個城市。 – Yada 2010-11-08 11:16:07

回答

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, .... 

從自己的數據庫中提取這些數據是沒有必要的。

+0

謝謝你看完這個 – user500574 2010-11-08 22:17:08

+0

看完doco後,這正是我一直在尋找的!再見200萬記錄城市表! – user500574 2010-11-09 03:44:34

0

怎麼樣在城市表:

  1. 嘗試countryid/regionidasciName/isoName(無論是用於自動完成結果)加算指標

  2. 不要使用LIKE "%new york%"用於自動完成查詢作爲在這種形式下MySQL不能使用VARCHAR索引。你必須在它前面運行它沒有百分比字符:"new york%"

  3. ,直到用戶選擇國家/地區可以隱藏城市輸入字段 - 這樣你可以在countryid/regionid領域限制自動完成查詢(並使用其索引)。

  4. 將自動完成輸入的時間設置爲僅在輸入最後一個字符後過去1秒(或大約1秒)後才發送查詢。