Регистрационная форма со страной, регионом, городом - Как управлять 2 миллионами записей MySQL? - PullRequest
1 голос
/ 08 ноября 2010

Я создаю веб-приложение, используя PHP-фреймворк CodeIgniter.Приложение опирается на правильную информацию о стране, регионе и городе пользователя.

В настоящее время у меня есть форма регистрации с раскрывающимся окном страны (заполняется из базы данных), раскрывающимся окном региона (заполняется с помощью ajax в зависимости от страны) и раскрывающимся окном города (автозаполнение jquery с использованием ajax в зависимости отстрана и регион).

Моя проблема в городской базе данных, содержащей более 2 миллионов записей, и ее автозаполнение выполняется довольно медленно.Я видел такие вещи, например, в других местах.События Facebook, где автозаполнение для местоположения намного быстрее.

Мой вопрос: есть ли способ ускорить этот процесс (оптимизировать базу данных MySQL, вызовы ajax), чтобы ускорить его, или есть другой способ сделать это, используя что-то вроде API Карт Google?

Любые мнения / комментарии / идеи приветствуются.

Вот основные определения для моих таблиц:

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 для заполнения таблиц стран и регионов,и свободно доступная база данных города для таблицы city.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Я бы использовал 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 голосов
/ 08 ноября 2010

Как насчет таблицы City:

  1. Попробуйте добавить индексы для countryid / regionid и asciName / isoName (в зависимости от того, что используется для результатов автозаполнения)

  2. Не используйте LIKE "%new york%" для запроса автозаполнения, поскольку в этой форме MySQL не может использовать индекс VARCHAR.Вы должны запускать его без знака процента перед ним: "new york%".

  3. Вы можете скрыть поле ввода города, пока пользователь не выберет страну / регион - таким образом, вы можете ограничить автозаполнение запроса наcountryid / regionid полей (и использовать их индексы).

  4. Время вашего автозаполнения ввода только для отправки запроса по истечении 1 секунды (или около того) с момента ввода последнего символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...