Увеличить скорость запроса MySQL LIKE?

Для поля ввода аэропорта с автозаполнением в настоящее время существует одна таблица с описаниями аэропортов, autocomplete_airport:

lang | description (with INDEX)                           | ...
-----+----------------------------------------------------+----
pt   | New York - John F Kennedy (JFK), Estados Unidos    | ...
pt   | Nova Iorque - John F Kennedy (JFK), Estados Unidos | ...
...

Автозаполнение работает с отдельными словами. Поэтому, когда пользователь вводит «yor», появляется «new york» (если в LIMIT). В настоящее время запрос работает следующим образом:

SELECT * FROM autocomplete_airport WHERE lang = "pt"
AND (description LIKE "%(yor)%"
     OR description LIKE "yor%"
     OR description LIKE "% yor%")
ORDER BY description
LIMIT 15

Теперь мне интересно, как ускорить процесс. Одна из идей состоит в том, чтобы создать следующую структуру базы данных с таблицами autocomplete_airportи autocomplete_airport_word:

id   | lang | description (with INDEX)                           | ...
-----+------+----------------------------------------------------+----
123  | pt   | New York - John F Kennedy (JFK), Estados Unidos    | ...
124  | pt   | Nova Iorque - John F Kennedy (JFK), Estados Unidos | ...
...

word (with INDEX) | autocomplete_airport_id
------------------+------------------------
New               |                     123
York              |                     123
John              |                     123
F                 |                     123
Kennedy           |                     123
JFK               |                     123
...

Тогда SELECT нужно будет искать только в начале строк:

SELECT DISTINCT autocomplete_airport.*
FROM autocomplete_airport
INNER JOIN autocomplete_airport_word 
ON autocomplete_airport.id = autocomplete_airport_word.autocomplete_airport_id
WHERE lang = "pt"
AND word LIKE "yor%"
ORDER BY description
LIMIT 15

Это новое? структура того стоит? Это действительно ускорит работу? Есть ли более простой способ?

Обновление

Только что заметил, что в таблице слов есть изъян. Последствие: поиск «Нью-Йорк» не даст никакого результата. Что должно работать:

term (with INDEX)                               | autocomplete_airport_id
------------------------------------------------+------------------------
New York - John F Kennedy (JFK), Estados Unidos | 123
York - John F Kennedy (JFK), Estados Unidos     | 123
John F Kennedy (JFK), Estados Unidos            | 123
F Kennedy (JFK), Estados Unidos                 | 123
Kennedy (JFK), Estados Unidos                   | 123
(JFK), Estados Unidos                           | 123
Estados Unidos                                  | 123
Unidos                                          | 123
JFK                                             | 123
5
задан feklee 15 March 2012 в 18:30
поделиться