Wie funktioniert mysql SELECT
aus einer Tabelle, die eine oder mehrere TEXT
-Spalte hat?
Übernehmen Sie diese Abfrage:
%Vor% Soweit ich weiß, speichern TEXT
-Typen auf der Festplatte und haben einen Zeiger in der Tabelle. so wie diese Abfrage in Aktion funktioniert?
Welches Szenario ist in Ordnung?
1 : MySQL lädt den gesamten zu dieser Tabelle gehörenden Text und beginnt dann mit der Suche in der Tabelle. findet # 1, ruft den Inhalt ab und gibt die Zeile zurück. (Vor dem Laden aller TEXT
)
2 : MySQL sucht in Tabelle, findet # 1, lädt die spezifische TEXT
bezogen auf die aktuelle übereinstimmende Zeile von der Festplatte und gibt die Zeile zurück. (etwas wie faulen Laden !!)
Oder vielleicht funktioniert MySQL anders!
und wie eine sehr große Tabelle mit TEXT
Spalte drin SELECT
und Lesegeschwindigkeiten reduzieren kann?
Wenn Sie eine Abfrage ausführen und Ihr Prädikat eine indizierte Spalte enthält. Nehmen wir an, Ihr Index ist ein B-Tree auf dem Primärschlüssel. dann wird der Index / Baum durchlaufen, bis Sie den Zeiger auf die Arbeitslast (Tupel / Zeile) erreichen. Sie werden die ganze Zeile von der Festplatte lesen.
Sie hatten eine Reichweite: id & gt; x und id & lt; y, und wenn der Index gruppiert wurde (so dass der Blattknoten eines B-Baums die sequentiell auf der Platte gespeicherten Tupel enthält), findet er die Nutzlast von id = x und durchsucht die Platte sequentiell, bis er id = y - 1 erreicht hat / p>
Ich sehe also nicht, wo der Unterschied liegt, wenn eine projizierte Spalte TEXT oder VARCHAR war, außer wenn Sie einen Index für diese bestimmte Spalte benötigen, da TEXT eine variable Größe hat, müssen Sie möglicherweise den Index auf ein großes Präfix begrenzen .
Ich denke deine Frage ist falsch.
und wie eine sehr große Tabelle mit TEXT-Spalte darin SELECT- und Lesegeschwindigkeiten reduzieren kann?
Sie möchten wahrscheinlich die Lesegeschwindigkeit erhöhen und nicht verringern.
Wenn Ihre TEXT-Felder sehr viele Daten enthalten, können Sie die Geschwindigkeit erhöhen, indem Sie bessere Hardware verwenden und den SQL-Server auf der gleichen Hardware wie Ihre Anwendung haben, um keinen Netzwerkverkehr zu haben. Der Cache des SQL-Servers sollte groß sein. Dann könnten die zuletzt verwendeten Daten schneller abgerufen werden, da sie im RAM-Speicher und nicht auf der Festplatte gespeichert sind.
Wenn kein Index verwendet werden kann, um "id = 1" zu finden, ja, MySQL wird alles laden, bevor es "id = 1" finden kann, wie Ihre Option 1 leider.
Sie können es testen, um zu sehen, ob es auf Ihrem System wahr ist (unterschiedliche MySQL-Version / DB-Engine kann andere Ergebnisse haben):
1) Erstellen Sie eine Tabelle test1 mit zwei Spalten fno int Datentext
2) füllen Sie die Tabelle mit einem wirklich großen Text, mit eindeutigen fno und Text, so dass Sie eine Zeile in den folgenden Abfragen zurückgeben können.
3) Durchsuchen Sie die Tabelle mit:
%Vor%Sie werden sehen, dass ihre Laufzeit sehr nahe ist. Sie können sie in anderer Reihenfolge erneut ausführen, um sicherzustellen, dass das Caching das Ergebnis nicht beeinflusst.
Wenn MySQL die Textspalte nur nach WHERE lädt, sollte die erste Abfrage viel schneller sein als die zweite, da sie die Datenspalte für WHERE nicht benötigt oder lädt.
Der MySQL-Server fordert die db-Engine auf, alle Spalten für WHERE zurückzugeben, wenn kein Index verwendet werden kann. (Wenn ein Index verwendet werden kann, fordert MySQL die db-Engine auf, den Index zu verwenden und nur die übereinstimmenden Zeilen zurückzugeben und bei Bedarf weitere WHERE-Filter für diese Zeilen zu verarbeiten).
Um das Problem zu lösen, müssen Sie einen Index für fno erstellen. Sie werden sehen, dass die erste Abfrage nach dem Index sehr viel schneller ist. Wenn der Tabellenscan nicht vollständig vermieden werden kann und Sie nicht in der Textspalte (Daten) suchen möchten, können Sie die Textspalte in eine andere Tabelle verschieben und mit einem eindeutigen Schlüssel wie folgt mit der Haupttabelle verknüpfen:
Dateitabelle: FNr Fid fname
Datenbanktabelle: Fid Daten
suche dann wie:
%Vor%So scheint es, dass Sie wirklich einige Hintergrundinformationen darüber benötigen, wie MySQL-Indizes funktionieren .
Sie sollten einen Index für jede Spalte haben, in der Sie WHERE
, ORDER BY
, JOIN
, GROUP BY
usw. verwenden möchten. MySQL verwendet den Index, den Sie auf id
setzen würden Lösen Sie die Filterkriterien WHERE id=1
in Ihrem Beispielfall auf. Wenn Sie in diesem Fall keinen Index für id
haben, würde MySQL einen vollständigen Tabellenscan benötigen, um die Datensätze zu finden, die Ihre Kriterien erfüllen. Sie wollen das NICHT.