2009-09-09 4 views
5

Wenn es ein int ist, weiß ich, dass es schneller sein wird, kann den String-Typ einfach nicht verstehen.Warum wird ein Index für diese Spalte für eine char/varchar/text-Spalte die Suche beschleunigen?

hinweise: meisten asiatischen sprache haben nicht den raum zwischen worten. und mysql kann den Satz nicht in Wörter aufteilen. und ich meine zufällige Suche, das heißt, Wörter können irgendwo in einem Satz vorkommen.

+0

Denken Sie an eine Zeichenfolge als eine Reihe von Zahlen ... Hilfe? –

Antwort

6

Ein großer Punkt ist, dass ein Index für bestimmte Arten der Suche überhaupt nicht hilft. Zum Beispiel:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE '%' + @SearchText + '%' 

Kein Betrag der normalen Indizierung wird diese Abfrage helfen. Es ist für immer dazu verdammt, langsam zu sein. Das LIKE Ausdruck ist einfach nicht sargable.

Warum? Sie müssen zuerst verstehen, wie Indizes funktionieren. Sie nehmen grundsätzlich die Spalten, die zusammen mit dem Primärschlüssel (Datensatzzeiger) in eine neue Tabelle indiziert werden. Sie sortieren dann diese Tabelle für die indizierte Spalte und nicht für den Schlüssel. Wenn Sie eine Suche mit dem Index durchführen, kann er die gewünschten Zeilen sehr schnell finden, da dieser Index sortiert ist, um eine effizientere Suche mit Algorithmen wie der binären Suche und anderen zu ermöglichen.

Schauen Sie sich diese Abfrage erneut an. Wenn Sie einen Platzhalter vor dem Suchtext platzieren, haben Sie der Datenbank gerade gesagt, dass Sie nicht sicher wissen, mit welcher Spalte die Spalte beginnt. Kein Sortieraufwand wird helfen; Sie müssen immer noch die gesamte Tabelle durchgehen, um sicherzustellen, dass Sie jeden Datensatz finden, der dem Ausdruck entspricht. Und das bedeutet, dass ein normaler Index für die Spalte für diese Abfrage wertlos ist.

Wenn Sie eine Textspalte nach einem Suchstring an einer beliebigen Stelle in der Spalte suchen möchten, müssen Sie etwas anderes verwenden: einen Volltextindex.

nun für den Kontrast zu dieser Abfrage aussehen:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE @SearchText + '%' 

mit einem normalen Index Dies funktioniert völlig in Ordnung, weil Sie wissen, wie Sie die Spalte starten erwarten. Es kann immer noch mit den sortierten Werten übereinstimmen, die im Index gespeichert sind, und so können wir sagen, dass es sargable ist.

+0

ja, das frage ich mich, danke. – lovespring

4

Ein Index ist sortiert, eine Tabelle ist nicht. Wenn Sie also nach einem Index suchen, hat er einen Hinweis darauf, wo die Zeichenfolge gefunden werden kann, auch wenn für jede Zeile in der Tabelle ein anderer Wert angegeben wird.

Darüber hinaus sind die Indizes kleiner (in der Regel) als die Tabelle. Um jede Spalte in der Tabelle zu durchsuchen, müssen Sie jede Zeile durchlaufen. Eine Indexsuche sucht nur den richtigen Punkt im Index, wählt diesen aus, greift den Zeiger zum gruppierten Index und entfernt Sie, um den Rest der Zeile zu erhalten.

+1

Wenn Ihre Daten in den ersten Zeichen meist eindeutig sind, indexieren Sie den Rest der char/varchar-Spalte nicht und die von der Datenbank erstellten Indizes sind um so viel kleiner. Die meisten Datenbanken, die ich verwendet habe, erforderten immer eine Begrenzung der Zeichenkettenlänge für die Indizierung von Textspalten. – sj2009

+0

Nein, Suche ist Zufallssuche, habe meinen Beitrag bearbeitet, siehe meine Notizen. – lovespring

0

Der Index ist im Wesentlichen eine 2-spaltige Tabelle mit dem indizierten Feld in sortierter Reihenfolge zusammen mit der PK-Suche. SO für einen String, hat es die Strings in sortierter Reihenfolge. Eine Suche kann dann mit einer binären Suche anstelle einer Tabellensuche durchgeführt werden, die für fast jede Tabellenlänge viel schneller ist.

1

Der Index ist im Wesentlichen wie ein Index in einem Buch, in dem jedes Wort (abhängig vom Buch), das im Buch erscheint, in den Index gestellt wird, mit den Seitenzahlen, an denen dieses Wort erscheint. Der Index ist alphabetisch sortiert, so dass das Wort im Index schnell gefunden wird. Wenn Sie den Index nicht in einem Buch haben, ist die einzige Möglichkeit, jede Instanz eines bestimmten Wortes zu finden, das gesamte Buch zu lesen und zu notieren, wo dieses Wort erscheint.

Eine Tabelle ist genau das gleiche. Wenn Sie nach einem Datensatz mit einem bestimmten Spaltenwert suchen und keinen Index haben, kann die Datenbank nur durch die gesamte Tabelle iterieren, um eine Übereinstimmung zu finden.

1

Ein Telefonbuch ist mit Nachnamen indiziert. Kannst du dir vorstellen, wie langsam eine Nummer aussehen würde, wenn es nicht wäre?

2

Die einfachste Antwort ist noch ein paar Fragen:

  • Warum ist eine Person, die von ihrem/seinen letzten Namen sehr schnell im Telefonbuch zu finden?
  • Warum ist die Suche nach einer Person von seiner ersten Name nicht schnell im Telefonbuch?
Verwandte Themen