Ich habe eine Tabelle mit einem mehrspaltigen UNIQUE
Index für _job_id__
und __keyword_id__
.
Müsste ich auch einen weiteren Index hinzufügen, __job_id__
wenn ich eine häufige Abfrage habe, die eine GROUP BY
für diese Spalte ausführt ?
(Bei 100 Millionen Zeilen kann es eine Weile dauern. Deshalb frage ich, anstatt es nur zu tun.)
Antworten:
Nein überhaupt nicht !!! Das MySQL Query Optimizer macht das Richtige, wenn sich die benötigten Hauptspalten ganz links im Index befinden. Wenn Sie einen solchen Index erstellt haben, kann das MySQL Query Optimizer diesen Index möglicherweise nie verwenden, wenn Sie immer GROUP BY job_id, keyword_id ausführen. MySQL Query Optimizer verwendet den Index möglicherweise nicht oder nicht, wenn Sie Datensätze nur mit job_id erfassen, aber dann haben Sie trotzdem einen redundanten Index, der Speicherplatz verschwendet.
Wenn die Tabelle MyISAM ist, würde das Erstellen eines solchen Index nur die MYI-Datei aufblähen.
Wenn die Tabelle InnoDB ist und innodb_file_per_table 0 ist, würde das Erstellen eines solchen Index nur ibdata1 aufblähen.
Wenn die Tabelle InnoDB ist und innodb_file_per_table 1 ist, würde das Erstellen eines solchen Index nur die .ibd-Datei der Tabelle aufblähen.
Zusammenfassend müssen Sie diesen zusätzlichen Index nicht erstellen !!!
quelle
Indizes können
group by
Vorgänge nur beschleunigen, indem sie die Sortierung reduzieren. Dies ist effizienter, wenn der verwendete Index der Clustered-Index ist oder mindestens dieselbe führende Spalte wie der Clustered-Index hat. Bei alledem gehe ich davon aus, dass MySQL kein Äquivalent zu einerhash group by
Operation hat, die normalerweise den Nutzen von Indizes überhaupt umgeht - vielleicht kann dies jemand anderes bestätigen.Die
job_id
Annahme eines separaten Index hat nur einen geringen Vorteil, wenn davon ausgegangen wird, dass dies die einzige Spalte in dergroup by
Klausel ist und der Clustered-Index auch nicht: Der Index ist kleiner, und beim Scannen werden weniger E / A generiert--BEARBEITEN--
Da ein Index alle für den Clustered-Indexschlüssel definierten Primärschlüsselfelder enthält, die nicht im Sekundärindex enthalten sind , ist ein Index on
job_id
nur kleiner als ein Index on,job_id, keyword_id
wenn erkeyword_id
nicht Teil des Clustered-Index ist.quelle