Muss ich einer Tabelle einen neuen einspaltigen Index hinzufügen, wenn in diesem Feld bereits ein mehrspaltiger Index vorhanden ist?

10

Ich habe eine Tabelle mit einem mehrspaltigen UNIQUEIndex 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 BYfür diese Spalte ausführt ?

(Bei 100 Millionen Zeilen kann es eine Weile dauern. Deshalb frage ich, anstatt es nur zu tun.)

JIStone
quelle
Wenn es sich bei Ihrer eigentlichen Frage um eine langsame Abfrage handelt, geben Sie bitte SHOW CREATE TABLE an. SHOW TABLE STATUS SHOW VARIABLES WIE '% buffer%' EXPLAIN SELECT ... Wie viel RAM ist verfügbar? Es gibt viele mögliche Gründe; Die meisten können durch Betrachten dieser Gegenstände entdeckt werden.
Rick James

Antworten:

5

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 !!!

RolandoMySQLDBA
quelle
Bist du sicher? Dieser Typ schlägt etwas anderes vor: stackoverflow.com/questions/179085/… oder unterscheidet sich das von MySQL zu MSSQL?
Tadej
4

Indizes können group byVorgä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 einer hash group byOperation hat, die normalerweise den Nutzen von Indizes überhaupt umgeht - vielleicht kann dies jemand anderes bestätigen.

Die job_idAnnahme eines separaten Index hat nur einen geringen Vorteil, wenn davon ausgegangen wird, dass dies die einzige Spalte in der group byKlausel 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_idnur kleiner als ein Index on, job_id, keyword_idwenn er keyword_idnicht Teil des Clustered-Index ist.

Jack sagt, versuchen Sie es mit topanswers.xyz
quelle