Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwendet MySQL vorhandene Indizes beim Erstellen neuer Indizes?

Nein, wird es nicht.

Theoretisch ein Index auf (site, product, value, id) verfügt über alles, was erforderlich ist, um einen Index für eine beliebige Teilmenge dieser Felder zu erstellen (einschließlich der Indizes für (product, value, id)). und (value, id) ).

Das Erstellen eines Index aus einem sekundären Index wird jedoch nicht unterstützt.

Zuerst MySQL unterstützt keinen schnellen vollständigen Index-Scan (das heißt, ein Index wird in physischer und nicht in logischer Reihenfolge gescannt), wodurch ein Indexzugriffspfad teurer wird als das Lesen der Tabelle. Für InnoDB ist dies kein Problem , da die Tabelle selbst immer geclustert ist.

Zweitens sind die Datensatzreihenfolgen in diesen Indizes völlig unterschiedlich, sodass die Datensätze trotzdem sortiert werden müssen.

Das Hauptproblem ist jedoch die Geschwindigkeit der Indexerstellung in MySQL ist, dass es die Bestellung vor Ort generiert (einfach die Datensätze einzeln in einen B-Tree einfügen ), anstatt eine vorsortierte Quelle zu verwenden. Wie @Daniel erwähnte, löst die schnelle Indexerstellung dieses Problem. Es ist als Plugin für 5.1 verfügbar und ist in 5.5 vorinstalliert .