Warum hat die Kardinalität des Indexes in MySQL unverändert bleiben, wenn ich, fügen Sie einen neuen index?
Habe ich einen FULLTEXT-index auf eine meiner MySQL-Datenbank-Tabellen wie folgt:
ALTER TABLE members ADD FULLTEXT(about,fname,lname,job_title);
Das problem ist, dass mit phpmyadmin ich kann sehen, dass die Kardinalität von meiner neuen index ist nur 1. Bedeutet dies, dass der index nie verwendet werden?
Habe ich ein analyze table-Befehl, aber es nicht scheinen, nichts zu tun.
analyze table members
Den jeweiligen Typen der index-Felder sind varchar(100) varchar(100), text, varchar(200) und die engine ist MyISAM und die Tabelle hat über 30.000 Zeilen, die alle einzigartig. Meine MySQL-version ist 5.0.45.
Mache ich etwas falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn man nur 1 Zeile in der Tabelle, die Kardinalität des index sollte 1 sein, natürlich. Es ist nur das zählen der Anzahl von eindeutigen Werten.
Wenn Sie denken, dass der eine index-lookup-Tabelle, basierend auf Eimer (wie ein hash), dann ist die Kardinalität ist die Anzahl der buckets.
Hier ist, wie es funktioniert: Wenn Sie erstellen einen index, über einen Satz von Spalten
(a,b,c,d)
, dann geht die Datenbank über alle Zeilen in der Tabelle, der Blick auf die bestellte Vierlinge von diesen 4 Spalten für jede Zeile. Lassen Sie uns sagen, dass Ihre Tabelle sieht wie folgt aus:Also, was die Datenbank schaut, ist nur die 4 Spalten (a,b,c,d):
Sehen, dass es nur 3 eindeutige Zeilen übrig? Diese werden unser Eimer, aber dazu kommen wir noch zurück. In der Realität, es gibt auch eine Datensatz-id, oder Zeilen-id für jede Zeile in der Tabelle. Also unsere ursprüngliche Tabelle sieht wie folgt aus:
So, wenn wir uns nur die 4 Spalten (a,b,c,d), wir sind wirklich auf der Suche auch auf die Zeilen-id:
Aber wir wollen lookup (a,b,c,d) und nicht durch eine Zeilen-id, also produzieren wir so etwas wie dieses:
Und schließlich gruppieren wir alle row-ids der Zeilen, die identicle (a,b,c,d) - Werte zusammen:
Sehen, dass? Die Werte von (a,b,c,d) und (1,1,1,1) (1,2,1,1) und (1,3,1,1) zum Schlüssel für unsere lookup-Tabelle in den Zeilen der ursprünglichen Tabelle.
Eigentlich nichts davon wirklich passiert, aber es sollte Ihnen eine gute Idee, wie man einen "naiven" (d.h. geradlinige) Implementierung eines index getan werden könnte.
Aber unter dem Strich ist dies: Kardinalität nur misst, wie viele eindeutige Zeilen sind in einem index. Und in unserem Beispiel wurde die Anzahl der Schlüssel in unserem lookup-Tabelle, die war 3.
Hoffe, das hilft!
Kann ich nicht definitiv beantworten, warum MySQL nicht die Berechnung der Kardinalität, aber ich vermute es mal. Die MySQL-Handbuch Staaten:
FULLTEXT-Indizes werden nur im MATCH ... GEGEN den (...) Abfragen, die Kräfte der index verwendet werden. Das MATCH ... GEGEN syntax funktioniert nicht, wenn es nicht einen FULLTEXT-index auf die Felder.
Meine Vermutung ist, dass die Kardinalität nicht berechnet, weil es ist wirklich nicht notwendig.
Beachten Sie, dass Suchanfragen gegen den index, obwohl die Kardinalität ist nicht festgelegt.
Für die Aufzeichnung, ANALYSIEREN TABELLE foobar-Anweisung zu setzen scheint die Kardinalität korrekt.