Автозаполнение запроса списка городов, занимающего слишком много времени для загрузки огромной таблицы городов - PullRequest
1 голос
/ 24 января 2011

У меня есть таблица городов с почти 1 600 000 записей.У меня есть текстовое поле автозаполнения, и у меня есть запрос на выборку данных города, страны:Я создал индексы для idmetrocenter, idcountry, metrocentername, countryname.Ответ даже тогда очень плохой.

Может кто-нибудь помочь мне сделать этот вывод быстрее.Я в настоящее время использую доктрину.Если кто-то может дать мне знать, решение в доктрине будет еще лучше.

Ответы [ 3 ]

1 голос
/ 24 января 2011

Сначала попробуйте explain запрос и посмотрите, эффективно ли используются индексы:

mysql> EXPLAIN SELECT m.idmetrocenter AS m__idmetrocenter, m.idcountry AS m__idcountry, m.metrocentername AS m__metrocentername, c.idcountry AS c__idcountry, c.countryname AS c__countryname FROM metrocenter m INNER JOIN country c ON m.idcountry = c.idcountry WHERE (m.metrocentername like "ap%" OR c.countryname like "ap%") ORDER BY m.metrocentername, c.countryname LIMIT 10 \G

Во-вторых: Попробуйте изменить оператор LIKE на полнотекстовый поиск (MATCH/AGAINST) http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

0 голосов
/ 26 января 2011

Когда вы делаете JOINS , вы должны сделать декартово произведение .Это очень дорого, и вам следует избегать этого.

В наше время вы должны забыть о нормализации данных .Как говорит Кэл Хендерсон из Flickr: « нормализованные данные для сестер » (слайд 27 из 41).Это делает поиск быстрее.Эти слайды действительно хороши и содержат много полезной информации.Так что на слайде 24 из 41 они говорят, что не использовали LIKE, потому что он медленный.Они используют индексы FULLTEXT (слайд 25 из 41).

Также я думаю, что вам следует кэшировать данные (автозаполнение) в памяти , используя redis для ускорения вашего сайта.Если вы не можете скомпилировать исходный код (redis и если вы можете скомпилировать phpredis или просто обычную версию php => predis ).Тогда вы могли бы даже использовать бесплатный план Redis To Go .Redis быстро! .

0 голосов
/ 26 января 2011

Помимо использования FTS, как предложил Франческо, вы также можете использовать встроенную в доктрины поисковую характеристику .Это просто создаст индекс со всеми словами для определенных столбцов и сделает их доступными эффективным и быстрым способом.

Если вы не можете создать / сделать нас из FTS, это путь.

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