2012-06-05 2 views
0

У меня есть база данных с структурой, как это:
создать таблицу для каждой страны, которая необходима MySQL -

  • t_person (IDP, idcity, имя, адр, TELS, застежка-молния, убывание, премия)
  • t_city (idcity, idcountry, CITYNAME)
  • t_country (idcountry, COUNTRYNAME)

Я хочу очень общий "живой поиск" (Google-подобный):

SELECT p.name, p.addr, p.zip, p.desc, c.cityname, x.countryname, 
MATCH (p.name, p.addr, p.zip, p.desc) 
AGAINST ('fred* tall* 94620*' IN BOOLEAN MODE) as score 
FROM t_person p 
INNER JOIN t_city c ON c.idcity = p.idcity 
INNER JOIN t_country x ON x.idcountry = c. idcountry 
WHERE MATCH (p.name, p.addr, p.zip, p.desc) 
AGAINST ('fred* tall* 94620*' IN BOOLEAN MODE) 
AND x.idcountry = 43 -- (i.e USA) 
ORDER BY score DESC, p.name ASC, p.premium DESC 

Если есть только 1000 - 1500 строк, этот запрос выполняется примерно через 0,011 с, но если есть 30000+ строк, это займет около 1,2 секунды (я протестировал его с помощью генератора данных). Вопрос в том, что, если я создам новую таблицу для лица evey country (1 --- n), примерно так:
t_person_uk, t_person_usa, t_person_spain, каждый с 1500 строк, я думаю, что таким образом поиски будут очень быстро.
PD, у меня уже есть минус 0,25 секунды, прежде чем сделать вызов AJAX для поиска.
спасибо, до свидания.

+2

Не создавайте таблицы для каждой страны, если вам не удалось выполнить индексацию. Где вы определили индексы? Что говорит вам ваш EXPLAIN? –

+0

Полный текстовый индекс (p.nombre, p.addr, p.zip, p.desc, p.tels)/ И EXPLAIN говорит, что все в порядке, строки 1, 1, 1, 32000 (сгенерированные данные, которые я использовал для тестирования) PRIMARY KEY везде, Keylength 2, null, 3, 2, также: разбиение на страницы (LIMIT 0, 15) не работает, потому что я должен заказать по наилучшему совпадению, имя ASC, «премиум» DESC (некоторые пользователи «премиум»), и вы знаете, как работает mysql (это то же самое или худшее, что выбор всех строк на в то же время). - без ограничений = 1.189 сек, с LIMIT 0, 15 = 1.219 сек – DanStarck

+0

что такое x.idpais? Я не вижу его нигде в вашей схеме. – matchdav

ответ

0

Это не прямой ответ на ваш вопрос, но слишком длинный для комментария.

В целом, эти типы поиска построены с использованием полнотекстовых поисковых систем индексирования, а не MySQL. Полнотекстовая поисковая система предложит вам гораздо больше возможностей, чем стандартный MATCH из MySQL.

Например, вы сможете выполнять частичные совпадения, возвращать результаты, отсортированные по дистанции, автоматически предлагать и автоматически завершать. MySQL предоставит вам только минимум: одна соответствующая функция с двумя или тремя режимами.

Хорошим примером полнотекстового индексирования является Apache Solr, построенный на вершине Луцен.

Кроме того, бесплатная и очень полная база данных географических данных доступна по номеру geonames.

Надеюсь, это не слишком вне темы для вас :)

+0

Спасибо zi42 Я проверю Apache Soir – DanStarck

0

Мое первое предложение было бы не искать текст вашего описания столбца с помощью SQL, если вы беспокоитесь о работе вашей БД слишком сильно под высоким трафиком , поскольку я подозреваю, что у вас много текста, сидящего там. Тем более, что это так далеко от приоритетной цепочки в ваших столбцах.

Подумав об этом ненадолго, я почти на 100% уверен, что это ваша самая большая загрузочная нагрузка. Я не знаю, как вы обслуживаете результаты в браузере, но вы, несомненно, получите лучшие результаты, скажем, с помощью python для прямого поиска строк.

Помимо этого, я не уверен, что вам сказать. Вы можете разбить свои таблицы, как вы говорите, получить доступ к ним программным путем, и если бы вы сделали это, я бы предложил создавать сводные таблицы. Но мне действительно не нравится эта идея.

+0

, вы занимаетесь мною много времени, потому что это самая важная часть проекта, но мне нужно сделать это с помощью php/mysql/jquery-ajax/MVC/POO ..., я много слышал о python, и я обязательно посмотрю на него когда-нибудь, спасибо – DanStarck

+0

Ну, тогда ваш следующий лучший вариант, вероятно, будет использовать библиотеку Perl Regex в PHP. – matchdav

Смежные вопросы