Ich testete ein Update zwischen zwei großen (~ 5 mil Datensätze jeweils), die etwa 10 Sekunden pro Update dauerte. So testete tun Erklären für mein erstes Mal der Auswahl:Optimierung Update-Abfrage mit Compound-Index
SELECT
T1.Z, T2.Z
FROM
TableB T1
INNER JOIN TableL T2
on T1.Name=T2.Name
and T1.C=T2.C
and T1.S=T2.S
and T1.Number>=T2.MinNumber
and T1.Number<=T2.MaxNumber
zurück Erklären Sie den folgende als mögliche Schlüssel:
- Namen
- C
- S
- Anzahl
und wählen Sie C als Schlüssel.
Ich wurde gesagt, dass meine beste Wette eine Verbindung Schlüssel und in der Reihenfolge der Auswahl so habe ich
Alter Table TableB Add Index Compound (Name,C,S,Number)
Und hatte eine Erklärung wieder zu machen, es ist meine Verbindung wählen würde, die Hoffnung, aber jetzt auch obwohl es zeigt die Verbindung Index als möglicher Schlüssel Index C. wählt es noch
ich gelesen, dass ich den Index erzwingen kann ich mit will:
SELECT
T1.Z, T2.Z
FROM TableB T1 Force Index(Compound)
INNER JOIN TableL T2
on T1.Name=T2.Name
and T1.C=T2.C
and T1.S=T2.S
and T1.Number>=T2.MinNumber
and T1.Number<=T2.MaxNumber
aber ich bin nicht sicher, ob es irgendwelche macht Sinn, die Auswahl von MySql zu übertreiben, und wenn es nicht hilft, das Update wird fast zwei Jahre dauern, scheint es nicht eine schlaue Sache zu testen.
Gibt es einen Schritt, den ich vermisse? Muss ich die anderen Schlüssel entfernen, so dass sie meine Verbindung auswählen und wenn ja, wie werde ich wissen, ob es sogar einen Unterschied machen wird (vorausgesetzt, dass Mysql es sah und es zurückwies)?
Ausgang T1 Erklären:(Anmerkung: ich noch nicht die Verbindung Index hinzugefügt haben, wie die Tabelle sehr groß ist und es könnte Zeit verschwendet werden, bis ich das herausfinden.Ich habe es vorher auf einer stark verkürzten Version der Tabelle, aber das wird mit diesem erklärt) Table1
- SELECT_TYPE nicht helfen: einfach
- Typ: ref
- possible_keys:
- Anzahl, C, S, Namens-
- Schlüssel: Name
- key_len: 303
- ref: func
- Reihen: 4
- Extra: SIMPLE
- Typ: ALLE
- possible_keys: minNumber, maxNumber
- Schlüssel wo
für Table2 Erklären
- SELECT_TYPE mit :
- key_length:
- ref:
- Reihen: 5.447.100
- Extra:
Cardinality(nur Indizes relevant hier gibt es ein paar andere zeigt):
Primär: 5139680
Name: 1284920
Nummer: 57749
C: 7002
S: So 21
@Strawberry Bitte beachten Sie mein Update Dies ist keine doppelte Frage noch ist es verdient, zu einem generischen 'Was ist ein Index?' Faden. Vielen Dank. – user3649739
Bitte schreiben Sie die Kardinalität für jeden Index, MySQL wählt einen, der am restriktivsten ist und in den Speicher passt. Bitte posten Sie auch die vollständige erweiterte Ausgabe. – Pentium10
"T1.Name = T2.Name" - Es ist keine Entschuldigung dafür, dass MySQL einen "schlechten" Index wählt - aber es ist auch keine gute Idee, große Tabellen in VARCHAR-Spalten zu verknüpfen. –