2013-07-09 12 views
5

Ich verwende mysql Datenbank, die nur eine Tabelle "data" mit 17,151257 rows.This Tabelle hat eine Spalte String hat. Ich möchte alle Zeilen, in denen String-Spalte enthält eine bestimmte Abfrage-String (gespeichert in „entered_query“ Variable) drucken, so dass ich verwendet folgende:mysql select-Abfrage-Optimierung und wie Grenze in mysql arbeitet

SELECT DISTINCT * from data WHERE string LIKE '%".$entered_query."%' limit 10

Wie offensichtlich obige Abfrage wird zu viel Zeit auszuführen .

Ich habe gelesen, dass Indizierung verwendet werden kann, aber wie in diesem Fall?
Ich habe auch daran gedacht, ganze Daten in 10 verschiedene Zeilen zu teilen und dann 10 parallele Abfragen mit
perl DBI auszuführen.

Jetzt habe ich folgende Fragen:

  1. Wie die Ausführungszeit reduzieren?
  2. Ich habe gehört, dass "LIKE" in mysql-Abfrage die Indizierung vermeidet, gibt es also eine bessere Alternative für obige Abfrage?
  3. Wenn wir Grenze 10 in mysql Abfrage verwenden, dann tut mysql stoppt, sobald die Ausführung, wie es die ersten 10 Ergebnisse findet oder erste sucht es ganze Daten für bestimmte Abfrage dann die ersten 10 Ergebnisse
+0

Ich hoffe, dass '$ inquired_query' nicht ganz enthält, was sein Name suggeriert. Andernfalls könnte dies eine Möglichkeit darstellen, um Ihre Abfragen zu beschleunigen, die Sie nicht möchten. – innaM

+0

Was soll 'DISTINCT *' tun und gibt es eine untere Grenze für die Größe der eingegebenen Zeichenfolge? – innaM

+0

@innaM DISTINCT * wird verwendet, um nur ein eindeutiges Tupel auszuwählen. $ entered_query enthält die Query, die von Benutzern eingegeben wird, um in der "string" -Spalte nach Tabelle "data" zu suchen. * Entschuldigung für die Auswahl eines verwirrenden Beispiels. –

Antwort

7

regelmäßige Indizierung kehrt können nicht verwendet werden, um diese Abfrage zu verbessern. MySQL-Indizes sind B-Bäume, was bedeutet, dass sie sehr schnell ein Präfix der indizierten Spalte finden können. Aber da Ihre LIKE Abfrage am Anfang % hat, gibt es kein eindeutiges Präfix für die Suche. Also muss jede Zeile gescannt werden, um dem Muster zu entsprechen.

Allerdings unterstützt MySQL auch die Volltextsuche. Dies erstellt einen Index aller Wörter in der Spalte und kann diese Wörter schnell finden. Einzelheiten finden Sie unter documentation.

Wenn Sie LIMIT 10 verwenden, wird der Scanvorgang beendet, sobald die ersten 10 Zeilen gefunden wurden, die die Bedingungen erfüllen. Es sei denn, Sie verwenden auch ORDER BY - dann muss es alle Zeilen finden, damit es sie sortieren kann, bevor sie die ersten 10 auswählt.

+0

Danke .... Gibt es irgendwelche Gründe, um das gleiche Ergebnis zu erreichen, ohne LIKE zu verwenden? Und wie wäre es, wenn ganze Daten in 10 verschiedene Zeilen aufgeteilt würden und dann 10 parallele Abfragen mit Perl DBI ausgeführt würden. –

+0

Ich habe dir gesagt, wie es geht, ohne LIKE zu benutzen, benutze die Volltextsuche. Je nachdem, wie viele Kerne Sie auf dem Datenbankserver haben, hängt dies möglicherweise von der Aufteilung in separate Abfragen ab. Aber der Engpass ist wahrscheinlich die Festplatte, also wird es nicht zu viel helfen. – Barmar

Verwandte Themen