Ich arbeite in einer MySQL-Datenbank mit einer Tabelle wie dieser:
+--------------+
| table_name |
+--------------+
| myField |
+--------------+
... und ich muss eine Menge solcher Fragen stellen (mit 5-10 Zeichen in der Liste) :
SELECT myField FROM table_name
WHERE myField IN ('something', 'other stuff', 'some other a bit longer'...)
Es wird rund 24.000.000 eindeutige Zeilen geben
1) Soll ich einen FULLTEXT
oder und INDEX
Schlüssel für meine verwenden VARCHAR(150)
?
2) Wenn ich die Zeichen von 150 auf 220 oder 250 erhöhe ... würde das einen großen Unterschied machen? (Gibt es eine Möglichkeit, dies zu berechnen?)
3) Wie ich bereits sagte, werden sie eindeutig sein, daher sollte myField ein PRIMARY KEY sein . Ist es nicht selten, einem Feld, das bereits ein VARCHAR INDEX / FULLTEXT ist, einen PRIMARY KEY hinzuzufügen?
mysql
index
full-text-search
varchar
Mark Tower
quelle
quelle
Antworten:
VORSCHLAG 1: Standardindizierung
Wenn Sie so indizieren, können Sie entweder nach der gesamten Zeichenfolge suchen oder linksgerichtete LIKE-Suchen durchführen
VORSCHLAG 2: Volltextindizierung
Sie können effektiv nach einzelnen Stichwörtern und ganzen Phrasen suchen. Sie müssen eine benutzerdefinierte Stoppwortliste definieren, da MySQL keine 543 Wörter indiziert .
Hier sind meine anderen Beiträge der letzten zwei Jahre zu FULLTEXT-Indizes
May 23, 2011
: Optimieren der MySQL-Volltextsuche (StackOverflow)Oct 25, 2011
: Der FULLTEXT-Index wird im BOOLEAN-MODUS mit der Bedingung 'Anzahl der Wörter' ignoriertJan 26, 2012
: MySQL Volltextsuche my.cnf OptimierungMay 07, 2012
: MySQL EXPLAIN zeigt für FULLTEXT nicht 'use index' anVORSCHLAG 3: Hash-Indizierung
Wenn Sie nach einem bestimmten Wert suchen und diese Werte länger als 32 Zeichen sein können, können Sie den Hash-Wert speichern:
Auf diese Weise suchen Sie einfach nach Hash-Werten, um die Ergebnisse abzurufen
Versuche es !!!
quelle
like 'a%'
?Mit MySQL können Sie einen Präfixindex definieren, dh, Sie definieren die ersten N Zeichen der zu indizierenden Originalzeichenfolge. Der Trick besteht darin, eine Zahl N zu wählen, die lang genug ist, um eine gute Selektivität zu erzielen, aber kurz genug, um Platz zu sparen. Das Präfix sollte lang genug sein, um den Index fast so nützlich zu machen, als ob Sie die gesamte Spalte indiziert hätten.
Bevor wir weitermachen, lassen Sie uns einige wichtige Begriffe definieren. Die Indexselektivität ist das Verhältnis der gesamten indizierten Werte und der Gesamtanzahl der Zeilen . Hier ist ein Beispiel für eine Testtabelle:
Indizieren wir nur das erste Zeichen (N = 1), sieht die Indextabelle wie folgt aus:
In diesem Fall ist die Indexselektivität gleich IS = 1/3 = 0,33.
Lassen Sie uns nun sehen, was passieren wird, wenn wir die Anzahl der indizierten Zeichen auf zwei erhöhen (N = 2).
In diesem Szenario ist IS = 2/3 = 0,66, was bedeutet, dass wir die Indexselektivität erhöht haben, aber wir haben auch die Größe des Index erhöht. Der Trick besteht darin, die minimale Zahl N zu finden, die zu maximaler Indexselektivität führt .
Es gibt zwei Ansätze, mit denen Sie Berechnungen für Ihre Datenbanktabelle durchführen können. Ich werde auf diesem Datenbank-Dump demonstrieren .
Lassen Sie uns sagen , dass wir Spalte hinzufügen möchten last_name in der Tabelle Mitarbeiter auf den Index, und wir wollen die kleinste Zahl definieren , N , die die beste Index Selektivität produzieren.
Lassen Sie uns zuerst die häufigsten Nachnamen identifizieren:
Wie Sie sehen, ist der Nachname Baba der häufigste. Jetzt werden wir die am häufigsten vorkommenden Nachnamen- Präfixe finden, beginnend mit Präfixen aus fünf Buchstaben.
Es gibt viel mehr Vorkommen für jedes Präfix, was bedeutet, dass wir die Zahl N erhöhen müssen, bis die Werte fast dieselben sind wie im vorherigen Beispiel.
Hier sind Ergebnisse für N = 9
Hier sind Ergebnisse für N = 10.
Das sind sehr gute Ergebnisse. Dies bedeutet, dass wir einen Index für die Spalte Nachname erstellen können, wobei nur die ersten 10 Zeichen indiziert werden. In der Tabellendefinitionsspalte ist Nachname als definiert.
VARCHAR(16)
Dies bedeutet, dass wir 6 Bytes (oder mehr, wenn der Nachname UTF8-Zeichen enthält) pro Eintrag gespeichert haben. In dieser Tabelle gibt es 1637 verschiedene Werte, multipliziert mit 6 Bytes, was ungefähr 9 KB entspricht. Stellen Sie sich vor, wie diese Zahl wachsen würde, wenn unsere Tabelle Millionen von Zeilen enthält.Sie können andere Methoden zum Berechnen der Anzahl von N in My Post Prefixed-Indizes in MySQL lesen .
Die Verwendung von MD5- und SHA1-Funktionen zur Erzeugung von Werten, die indiziert werden sollen, ist ebenfalls kein guter Ansatz . Warum? Read it in post So wählen Sie den richtigen Datentyp für einen Primärschlüssel in einer MySQL-Datenbank aus
quelle
If you index like this, you can either look for the whole string or do left-oriented LIKE searches
. Ich sagte auch , in SUGGESTION # 3:If you are looking for one specific value and those values could be lengths well beyond 32 characters, you could store the hash value:
. Ihre Antwort zeigt hinreichend, warum man keine großen Schlüssel verwenden und auf Zeichen ganz links indexieren sollte, was die Leistung beeinträchtigen kann. Ihre Antwort gehört hierher. +1 für Ihre Antwort und Willkommen bei DBA StackExchange.