3

Die folgende Anweisung MYSQL nimmt 0,577251 Sekunden:Wie schnell sollte meine Mysql LIKE-Anweisung sein?

SELECT synonym_group FROM synonym WHERE name LIKE '%ak%' 

Name ist ein varchar (250) Feld. Derzeit befinden sich 356.187 Datensätze in der Synonym-Datenbanktabelle. Daten: 21 MB. Indizes: 23 MB. Gesamtgröße: 45 MB. Bytes pro Zeile: 67.

Also ist 0,577251 Sekunden dann eine angemessene Zeit? Wenn nicht, was ist und was soll ich tun? Ich habe mehrere Threads zu dieser Art von Frage gelesen, und die Hauptlösung, die ich sehen kann, ist, etwas wie Sphinx zu benutzen.

Die Wahrheit ist, dass einige der Felder in meiner Tabelle wahrscheinlich irrelevant sind. Würde ich beispielsweise die Anzahl der Bytes pro Zeile halbieren, indem ich unnötige Felder eliminiere, würde das die Suche doppelt so schnell machen?

Vielen Dank im Voraus.

+0

Verwenden Sie diese Abfrage, um einen einzelnen Datensatz zu finden, oder können Sie mehrere Datensätze zurückgeben? Bitte geben Sie ein oder zwei Beispiele für die Zeichenfolge an, mit der die Übereinstimmung erwartet wird. –

Antwort

4

Wenn ak ein Wort, dann würde ein Volltextindex arbeiten (wenn Sie die minimale Wortlänge einstellen, siehe unten).

Also, eine Suche nach 'ak' mit einem FULLTEXT- Index würde auf diesem Spiel:

  • 'Dieses ak das.'
  • 'AK'
  • 'AK. Was auch immer.'
  • 'Was auch immer. AK.

Aber es würde nicht passen:

  • 'BAK'
  • 'AKT'

Es passen müssen Wortgrenzen in Ordnung sein.

Der Standardwert minimum word length für eine FULLTEXT-Suche ist 4 Zeichen. Du kannst FULLTEXT also nicht nach 'ak' suchen, weil es zu kurz ist. Sie können die Einstellung für die minimale Wortlänge verringern, aber Sie erhalten die Wörter 'the', 'and' und alle anderen Wörter mit drei oder weniger Buchstaben, die Sie nicht mit Ihrem FULLTEXT-Index überladen möchten.

Suche mit LIKE könnte Ihre einzige praktikable Option sein. Wenn Sie einen führenden Platzhalter ('%ak') verwenden, kann MySQL keinen Index zum Suchen des Datensatzes verwenden. Es muss alle Zeilen einscannen. Dennoch wird der Index zum Scannen verwendet, wenn Sie einen Deckungsindex haben.

Also, für Ihre Anfrage:

SELECT synonym_group FROM synonym WHERE name LIKE '%ak%' 

Wenn Sie eine mehrspaltige haben, Abdecken, Index auf (name, synonym_group), wird es tatsächlich nutzen immer noch den Index die Abfrage zu beantworten, aber nicht im traditionellen Sinn. MySQL durchsucht den Index, der in der Regel schneller ist als die eigentlichen Tabellendaten (Table Scan). Darüber hinaus verfügt das ideale System über genügend Arbeitsspeicher, um alle Indizes im Arbeitsspeicher zu speichern. Es wird also nur Arbeitsspeicher und nicht Arbeitsspeicher gescannt.

Mit dem Deckungsindex hätte die Größe Ihrer Zeilen keine Auswirkung.

Ohne den Deckungsindex würde die Größe Ihrer Zeilen die Scan-Geschwindigkeit beeinflussen, da sich die Festplatte weiter bewegen muss.

Wenn Sie am Ende Tabellenscans durchführen, sollten Sie Ihre Tabelle defragmentieren und vorzugsweise Zeilen fester Länge (CHAR anstelle von VARCHAR) haben.

4

Wenn Sie den Operator LIKE verwenden, der mit % beginnt, wird für Ihre Auswahl kein Index verwendet.

Also, ja, diese Zeit ist normal.

+0

Vielen Dank! Würde man einen FULLTEXT-Index auf das Feld setzen und dann mit einer FULLTEXT-Suche beschleunigen? Würde Lucene/Sphinx die Dinge beschleunigen? – oyvey

+0

@oyvey: Siehe Marcus 'Antwort. –

3

Wie erwähnt, kann die Suche mit% zu Beginn nicht Ihren Index verwenden, und muss die gesamte Tabelle scannen (schlecht und wird nur schlimmer, wenn die Tabellengröße zunimmt). Das Verringern der Anzahl der Spalten wird wahrscheinlich nicht helfen, da der tatsächliche CPU-Drain die Zeichenfolge in jeder Zeile durchläuft.

In diesem Fall sollten Sie mit einer Volltextsuche und Index berücksichtigen: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html