2017-10-02 2 views
0
beitreten

Ich mache aus zwei Tabellen von verschiedenen Datenbanken verbinden:MySQL Index funktioniert nicht richtig in

SELECT 
    count(*) 
FROM 
    `db1`.`view1` p 
    join 
    `db2`.`table1` e 
      on e.Migration = p.s_encargo and e.did=149; 

ich einen Index in Tabelle 1 wie folgt aus:

alter table table1 add INDEX `DID_Migration` (`DID`, `Migration`); 

ich das addierte zwei Felder, die ich auf Klausel in im Index (‚haben‘ und ‚Migration‘)

Aber wenn ich die Abfrage ausführen, verwendet nur die erste Spalte des Indexes (tat): enter image description here Dies ist die Erklärung der Abfrage.

Aber wenn ich zeigen, die erklären, der dieser anderen Frage:

select * from table1 where Migration = '100008600' and did=149; 

diese Anwendung alle Spalten Index: enter image description here

Warum in der ersten Abfrage nur die erste Spalte des Index verwenden, und in der zweiten Abfrage verwendet die zwei Spalten?

+0

möchten, können Sie zur Verfügung stellen Tabellenstruktur DDL (Spaltentypen und Randbedingungen)? –

+0

Bitte geben Sie uns Informationen zu Tabelle1: Wie viele Zeilen drin? Wie viele Zeilen pro 'Migration' (min/max/avg)? Wie viele Zeilen für 'DID = 149'? –

+0

DID = 149 haben 5435 Zeilen. Tabelle1 hat 96003 Zeilen. Migration ist die ID einer anderen Tabelle, die Kombination DID und Migration sollte – hlastras

Antwort

0

Die Spalte key_len gibt die Länge des Schlüssels an, den MySQL verwendet hat. Mit dem Wert von key_len können Sie bestimmen, wie viele Teile eines mehrteiligen Schlüssels MySQL tatsächlich verwendet.

Dies bedeutet, dass für die Abfrage deklariert Sie mysql wählen nur den ersten Teil Sie Kraft

in diesem Fall verwendet werden können (oder Verwendung) für verhängen den Index Sie

SELECT 
     count(*) 
    FROM 
     `db1`.`view1` p 
     join 
     `db2`.`table1` e FORCE INDEX FOR JOIN (`DID_Migration`) 
        on e.Migration = p.s_encargo and e.did=149; 
+0

Ich habe es gerade getestet, aber es verwendet immer noch den gleichen Index, es verwendet nur die erste Spalte des Index, nicht den ganzen Index. Die erste Tabelle des Joins ist keine Tabelle, sondern eine Ansicht mehrerer Tabellen.Ich weiß nicht, ob das ein Problem sein wird. – hlastras

+0

Wenn in der Abfrage in der on-Klausel p.s_encargo mit '1094723' zum Beispiel ändern, das funktioniert gut, verwenden Sie den vollständigen Index, wie die zweite Abfrage. – hlastras

+0

Der verwendete Index ist immer DID_migration in Ihrem EXPLAIN-Plan. Das Problem ist, dass nur der erste Teil der Schlüssel verwendet wird. Sie könnten also versuchen, die Schlüssel umzukehren, wenn Sie alle übereinstimmen müssen ... Denken Sie daran, dass der DID-Teil/Schlüssel ist am selektivsten und dies könnte die Kardinalität auf ein niedriges Niveau reduzieren, das der Abfrageoptimierer für optimal hält – scaisEdge

Verwandte Themen