У меня есть база данных с структурой, как это:
создать таблицу для каждой страны, которая необходима 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 для поиска.
спасибо, до свидания.
Не создавайте таблицы для каждой страны, если вам не удалось выполнить индексацию. Где вы определили индексы? Что говорит вам ваш EXPLAIN? –
Полный текстовый индекс (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
что такое x.idpais? Я не вижу его нигде в вашей схеме. – matchdav