Erhöhen Sie die Geschwindigkeit der MySQL-Abfrage WIE?

Für einen Flughafen-Eingabefeld mit Autovervollständigung gibt es derzeit eine Tabelle mit den Flughafen-Beschreibungen, autocomplete_airport:

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

Autocompletion funktioniert auf einzelne Wörter. Also, wenn der Benutzer "yor", dann "new york" zeigt sich (im LIMIT). Die Abfrage funktioniert derzeit wie folgt:

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

Nun Frage ich mich, wie die Dinge etwas beschleunigen. Eine Idee ist, erstellen Sie die folgenden Datenbank-Struktur, mit Tabellen autocomplete_airport und 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
...

WÄHLEN Sie dann würde nur noch die Suche am Anfang des strings:

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

Ist, dass die neue Struktur der Mühe Wert? Wäre es wirklich die Dinge etwas beschleunigen? Gibt es eine einfachere Möglichkeit?

Update

Ist nur aufgefallen, dass die word-Tabelle hat einen Fehler. Die Folge: die Suche nach "New York" nicht geben würde ohne Ergebnis. Was funktionieren sollte:

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
  • Machen Sie es wie diese!
InformationsquelleAutor feklee | 2012-03-15
Schreibe einen Kommentar